Les opérations de base de données nécessitent souvent de diviser les chaînes en lignes individuelles. Oracle propose des méthodes efficaces, notamment dans les versions 10g et supérieures, pour gérer cette tâche.
Une technique simple mais puissante utilise des expressions régulières et la clause connect by
. Cela implique de construire une table temporaire et d'utiliser des fonctions d'expression régulière pour extraire des sous-chaînes :
<code class="language-sql">with temp as ( select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error from dual union all select 109, 'test2', 'Err1' from dual ) select distinct t.name, t.project, trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) as error from temp t, table(cast(multiset(select level from dual connect by level <= length(regexp_replace(t.error, '[^,]+')) + 1) as sys.OdciNumberList)) levels;</code>
temp
CTE (Common Table Expression) simule des exemples de données.length(regexp_replace(t.error, '[^,] ')) 1
détermine le nombre d'erreurs en comptant les valeurs séparées par des virgules.select level from dual connect by level <= ...
génère une séquence de nombres de 1 au nombre d'erreurs.table(cast(multiset(...) as sys.OdciNumberList))
transforme la séquence de nombres en une collection utilisable.temp
avec la collection de numéros, créant toutes les combinaisons nécessaires.trim(regexp_substr(t.error, '[^,] ', 1, levels.column_value))
extrait chaque erreur en utilisant le numéro généré comme indicateur de position.Cette méthode divise efficacement les chaînes comportant plusieurs valeurs en lignes distinctes tout en préservant l'intégrité 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!