Diviser efficacement les chaînes séparées par des virgules en lignes dans Oracle 10g et 11g
Oracle propose plusieurs méthodes pour diviser les chaînes délimitées par des virgules en lignes individuelles. Cette approche améliorée exploite les expressions régulières et la clause CONNECT BY
pour une solution plus efficace :
<code class="language-sql">WITH temp AS ( SELECT 108 AS Name, 'test' AS Project, 'Err1, Err2, Err3' AS 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 OdciNumberList)) levels</code>
Explication détaillée :
Cette requête utilise une requête hiérarchique pour réaliser le fractionnement de la chaîne. Décomposons les étapes :
Exemples de données : La clause WITH
définit un exemple de table (temp
) contenant des chaînes d'erreur séparées par des virgules.
Nombre de délimiteurs : LENGTH(REGEXP_REPLACE(t.error, '[^,] ')) 1
calcule le nombre de virgules plus une (pour tenir compte du dernier élément). Cela détermine le nombre de lignes nécessaires.
Génération de la séquence : SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= ...
génère une séquence de nombres de 1 jusqu'au nombre d'éléments. CONNECT BY
est crucial pour créer cette séquence.
Création de collection : MULTISET(...)
crée une collection (un ensemble de nombres) à partir de la séquence générée. CAST(... AS OdciNumberList)
convertit ceci en un type de collection Oracle.
Transformation de table : TABLE(...)
transforme la collection en un ensemble de résultats, nous permettant de la joindre à la table temp
.
Extraction de chaîne : REGEXP_SUBSTR(t.error, '[^,] ', 1, levels.column_value)
extrait chaque sous-chaîne séparée par des virgules. [^,]
est une expression régulière correspondant à un ou plusieurs caractères autres que des virgules. levels.column_value
fournit le numéro d'occurrence de l'extraction.
Découpage et déduplication : TRIM(...)
supprime les espaces de début et de fin. SELECT DISTINCT
élimine les lignes en double, garantissant que chaque erreur n'apparaît qu'une seule fois.
Cette approche est efficace car elle évite les boucles et utilise les fonctions intégrées d'Oracle pour des performances optimisées. L'expression régulière fournit une méthode robuste pour gérer diverses longueurs de chaîne et les irrégularités potentielles dans les données délimitées par des virgules.
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!