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