L'"abuso" (come dice Colin 't Hart) di connected by ha un buon scopo qui:usando REGEXP_SUBSTR puoi estrarre solo una delle 4 corrispondenze (23,34,45,56):la regex [^,]+ corrisponde a qualsiasi sequenza di caratteri nella stringa che non contiene una virgola.
Se proverai a correre:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token"
FROM DUAL
riceverai 23 .
e se proverai a correre:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM DUAL
riceverai anche 23 solo che ora impostiamo anche due parametri aggiuntivi :inizia a cercare dalla posizione 1 (che è l'impostazione predefinita) e restituisce la prima occorrenza.
Ora eseguiamo:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM DUAL
questa volta otterremo 34 (2a occorrenza) e utilizzando 3 poiché l'ultimo parametro restituirà 45 e così via.
L'uso ricorsivo di connected by insieme a level assicurati di ricevere tutti i risultati pertinenti (non necessariamente nell'ordine originale però!):
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
tornerà:
TOKEN
23
34
45
56
che non solo contiene tutti e 4 i risultati, ma lo suddivide anche in righe separate nel set di risultati!
Se giocherai con esso - potrebbe darti una visione più chiara dell'argomento.