Maison >base de données >tutoriel mysql >Comment convertir des valeurs séparées par des virgules en lignes dans 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!