Oracle
 sql >> Database >  >> RDS >> Oracle

connettersi per clausola in regex_substr

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.