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 ?

DDD
DDDoriginal
2025-01-22 19:11:09378parcourir

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

Convertir les valeurs séparées par des virgules en lignes dans Oracle

La virgule est un délimiteur courant pour représenter plusieurs valeurs sous la forme d'une seule chaîne, mais lorsque vous travaillez avec des données dans Oracle, vous devrez peut-être séparer ces valeurs en différentes lignes. Ceci peut être réalisé de différentes manières.

Requête récursive utilisant des expressions régulières

Une solution consiste à utiliser une requête récursive avec une expression régulière pour extraire chaque valeur :

<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>

Cette requête utilise la fonction REGEXP_SUBSTR pour extraire chaque sous-chaîne sans virgule, puis concatène les résultats à l'aide d'une requête récursive.

Requête récursive sans expressions régulières

Une autre approche récursive qui évite d'utiliser des expressions régulières :

<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>

Cette requête utilise la fonction INSTR pour trouver la position de la virgule, puis utilise la fonction SUBSTR pour extraire les valeurs individuelles.

CTE utilisant l'union récursive

La troisième méthode utilise une expression de table commune (CTE) avec une union récursive :

<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>

Cette requête utilise l'opérateur UNION ALL pour créer un CTE récursif qui extrait chaque sous-chaîne autre qu'une virgule.

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!

Déclaration:
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