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.