"missbruket" (som Colin 't Hart uttryckte det) av connected by
har ett bra syfte här:genom att använda REGEXP_SUBSTR
du kan bara extrahera en av de fyra matchningarna (23,34,45,56):regexet [^,]+
matchar alla teckensekvenser i strängen som inte innehåller ett kommatecken.
Om du försöker köra:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token"
FROM DUAL
du får 23
.
och om du försöker köra:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM DUAL
du får också 23
bara att vi nu också ställer in två ytterligare parametrar :börja leta i position 1 (vilket är standard) och returnera den första förekomsten.
Nu kör vi:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM DUAL
den här gången får vi 34
(andra förekomsten) och med 3
eftersom den sista parametern returnerar 45
och så vidare.
Användningen av rekursiv connected by
tillsammans med level
ser till att du får alla relevanta resultat (inte nödvändigtvis i den ursprungliga ordningen dock!):
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
kommer att returnera:
TOKEN
23
34
45
56
som inte bara innehåller alla 4 resultaten, utan också delar upp det i separata rader i resultatuppsättningen!
Om du ska pyssla med det - det kan ge dig en tydligare bild av ämnet.