"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.