Oracle
 sql >> Base de données >  >> RDS >> Oracle

connecter par clause dans regex_substr

L'"abus" (comme le dit Colin 't Hart) de connected by a un bon but ici :en utilisant REGEXP_SUBSTR vous ne pouvez extraire qu'une seule des 4 correspondances (23,34,45,56) :la regex [^,]+ correspond à toute séquence de caractères dans la chaîne qui ne contient pas de virgule.

Si vous essayez d'exécuter :

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token" 
FROM   DUAL

vous obtiendrez 23 .

et si vous essayez d'exécuter :

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM   DUAL

vous obtiendrez également 23 seulement que maintenant nous définissons également deux paramètres supplémentaires :commence à chercher en position 1 (qui est la valeur par défaut), et renvoie la 1ère occurrence.

Exécutons maintenant :

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM   DUAL

cette fois, nous aurons 34 (2ème occurrence) et en utilisant 3 car le dernier paramètre renverra 45 et ainsi de suite.

L'utilisation de connected by récursif avec level s'assure que vous recevrez tous les résultats pertinents (pas nécessairement dans l'ordre d'origine !) :

SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token"
FROM   DUAL
CONNECT BY REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) IS NOT NULL
order by 1

renverra :

TOKEN
23
34
45
56

qui contient non seulement les 4 résultats, mais les divise également en lignes distinctes dans le jeu de résultats !

Si vous voulez jouer du violon avec elle - cela pourrait vous donner une vision plus claire du sujet.