"Nadużycie" (jak ujął to Colin't Hart) connected by
ma tutaj dobry cel:używając REGEXP_SUBSTR
możesz wyodrębnić tylko jedno z 4 dopasowań (23,34,45,56):wyrażenie regularne [^,]+
pasuje do dowolnej sekwencji znaków w łańcuchu, która nie zawiera przecinka.
Jeśli spróbujesz biegać:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token"
FROM DUAL
otrzymasz 23
.
a jeśli spróbujesz biegać:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM DUAL
otrzymasz także 23
tylko, że teraz ustawiamy również dwa dodatkowe parametry :zacznij szukać od pozycji 1 (co jest ustawieniem domyślnym) i zwróć pierwsze wystąpienie.
Teraz biegnijmy:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM DUAL
tym razem otrzymamy 34
(2. wystąpienie) i użycie 3
jako ostatni parametr zwróci 45
i tak dalej.
Użycie rekurencyjnych connected by
wraz z level
upewnia się, że otrzymasz wszystkie odpowiednie wyniki (choć niekoniecznie w oryginalnej kolejności!):
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
powróci:
TOKEN
23
34
45
56
który nie tylko zawiera wszystkie 4 wyniki, ale także dzieli je na osobne wiersze w zestawie wyników!
Jeśli będziesz skrzypować z nim - może dać ci jaśniejszy obraz tematu.