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.