Maison > base de données > tutoriel mysql > Comment diviser les valeurs séparées par des virgules dans Oracle en plusieurs lignes sans doublons ?

Comment diviser les valeurs séparées par des virgules dans Oracle en plusieurs lignes sans doublons ?

Patricia Arquette
Libérer: 2024-12-30 12:32:10
original
544 Les gens l'ont consulté

How to Split Comma-Separated Values in Oracle into Multiple Rows Without Duplicates?

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal