Maison > base de données > tutoriel mysql > Comment convertir des valeurs séparées par des virgules en lignes dans Oracle ?

Comment convertir des valeurs séparées par des virgules en lignes dans Oracle ?

Susan Sarandon
Libérer: 2025-01-22 18:52:11
original
687 Les gens l'ont consulté

How to Convert Comma-Separated Values to Rows in Oracle?

Transformation de données séparées par des virgules dans les bases de données Oracle

De nombreuses tâches de manipulation de données nécessitent la conversion de valeurs séparées par des virgules (CSV) dans une seule colonne en lignes individuelles pour une analyse plus facile. Oracle propose plusieurs approches pour y parvenir.

Méthode 1 : SQL récursif avec expressions régulières

Cette technique utilise des requêtes SQL récursives combinées à des expressions régulières pour un fractionnement CSV efficace :

<code class="language-sql">select distinct id, trim(regexp_substr(value,'[^,]+', 1, level) ) value, level
  from tbl1
   connect by regexp_substr(value, '[^,]+', 1, level) is not null
   order by id, level;</code>
Copier après la connexion

Cette requête extrait de manière itérative chaque valeur délimitée par des virgules, générant une nouvelle ligne pour chacune, et inclut un indicateur de niveau.

Méthode 2 : SQL récursif (CTE) sans expressions régulières

Une approche SQL plus standard utilise une expression de table commune (CTE) :

<code class="language-sql">with t (id,res,val,lev) as (
           select id, trim(regexp_substr(value,'[^,]+', 1, 1 )) res, value as val, 1 as lev
             from tbl1
            where regexp_substr(value, '[^,]+', 1, 1) is not null
            union all           
            select id, trim(regexp_substr(val,'[^,]+', 1, lev+1) ) res, val, lev+1 as lev
              from t
              where regexp_substr(val, '[^,]+', 1, lev+1) is not null
              )
select id, res,lev
  from t
order by id, lev;</code>
Copier après la connexion

Ce CTE récursif obtient le même résultat que la méthode précédente mais évite de recourir aux expressions régulières.

Méthode 3 : Approche non récursive (INSTR et SUBSTR)

Une alternative non récursive utilise les fonctions INSTR() et SUBSTR() pour localiser et extraire des valeurs :

<code class="language-sql">WITH t ( id, value, start_pos, end_pos ) AS
  ( SELECT id, value, 1, INSTR( value, ',' ) FROM tbl1
  UNION ALL
  SELECT id,
    value,
    end_pos                    + 1,
    INSTR( value, ',', end_pos + 1 )
  FROM t
  WHERE end_pos > 0
  )
SELECT id,
  SUBSTR( value, start_pos, DECODE( end_pos, 0, LENGTH( value ) + 1, end_pos ) - start_pos ) AS value
FROM t
ORDER BY id,
  start_pos;</code>
Copier après la connexion

Cette méthode trouve de manière itérative les positions des virgules et extrait les sous-chaînes, offrant une approche différente du problème.

La méthode optimale dépend de vos besoins spécifiques en matière de données et de performances. Pensez à tester chaque approche pour déterminer la solution la plus efficace pour votre environnement Oracle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal