Transformation de données délimitées par des virgules dans les bases de données Oracle
Les bases de données Oracle stockent fréquemment les données sous forme de valeurs séparées par des virgules dans une seule colonne, ce qui empêche une manipulation et une récupération efficaces des données. Cet article présente plusieurs méthodes pour convertir efficacement ces données délimitées par des virgules en lignes individuelles, améliorant ainsi l'analyse et le traitement des données.
Méthode 1 : Requête récursive avec expressions régulières
Cette solution élégante utilise une requête récursive et des expressions régulières pour une extraction efficace des valeurs :
<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>
La clause CONNECT BY
parcourt les valeurs séparées par des virgules, tandis que REGEXP_SUBSTR
extrait chaque sous-chaîne.
Méthode 2 : Approche conforme à l'ANSI avec CTE
Pour une portabilité améliorée, une expression de table commune (CTE) offre une alternative conforme à la norme ANSI :
<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>
Ce CTE récursif obtient le même résultat que la méthode précédente.
Méthode 3 : Approche récursive sans expressions régulières
Une troisième option évite les expressions régulières, en s'appuyant uniquement sur la manipulation de chaînes :
<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 méthode exploite la fonction INSTR
pour trouver les positions des virgules et SUBSTR
pour extraire les valeurs.
Ces techniques offrent des solutions efficaces et fiables pour transformer des valeurs séparées par des virgules en lignes au sein d'une base de données Oracle, facilitant ainsi une meilleure gestion et analyse des données.
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!