Diviser plusieurs valeurs séparées par des virgules dans une table Oracle en plusieurs lignes sans doublons
Lorsque vous traitez des données dans des tables Oracle, il est souvent nécessaire pour diviser les valeurs séparées par des virgules en plusieurs lignes. En utilisant une combinaison de CONNECT BY et d'expressions régulières, il est possible d'y parvenir. Cependant, il est essentiel d'éviter les lignes en double dans le résultat de la requête.
Requête de fractionnement de valeurs séparées par des virgules
WITH CTE AS ( SELECT 'a,b,c,d,e' temp, 1 slno FROM DUAL UNION SELECT 'f,g' temp, 2 slno FROM DUAL UNION SELECT 'h' temp, 3 slno FROM DUAL ) SELECT TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level)), slno FROM CTE CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+') AND PRIOR slno = slno AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
Explication
Cette requête utilise une clause récursive AVEC pour créer une expression de table commune (CTE) nommée CTE. Le CTE comprend trois lignes de données avec des valeurs séparées par des virgules.
L'instruction SELECT principale extrait ensuite les valeurs individuelles de la colonne temporaire. La fonction TRIM est utilisée pour supprimer tout espace de début ou de fin des valeurs. La fonction REGEXP_SUBSTR() est chargée de diviser la colonne temporaire en valeurs distinctes basées sur le délimiteur virgule.
La clause CONNECT BY effectue la division récursive. Cela garantit que chaque valeur séparée par des virgules se voit attribuer un niveau unique. La condition PRIOR slno = slno garantit que le niveau est incrémenté uniquement dans chaque ligne (slno).
De plus, la condition PRIOR DBMS_RANDOM.VALUE IS NOT NULL est utilisée pour empêcher la génération de lignes en double. DBMS_RANDOM.VALUE est une pseudo-colonne qui renvoie un nombre aléatoire. En le comparant à IS NOT NULL, nous introduisons un élément aléatoire qui élimine les doublons.
Le résultat final est un tableau avec plusieurs lignes, chacune contenant une seule valeur de la chaîne d'origine séparée par des virgules. Cette approche divise efficacement les valeurs sans produire de lignes en double.
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!