"Злоупотребата" (както го изрази Колин 'т Харт) на connected by има добра цел тук:чрез използване на REGEXP_SUBSTR можете да извлечете само едно от 4-те съвпадения (23,34,45,56):регулярният израз [^,]+ съответства на всяка последователност от знаци в низа, която не съдържа запетая.
Ако опитате да стартирате:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token"
FROM DUAL
ще получите 23 .
и ако опитате да стартирате:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM DUAL
ще получите също 23 само че сега също така задаваме два допълнителни параметъра :започнете да търсите в позиция 1 (която е по подразбиране) и върнете 1-то срещане.
Сега нека стартираме:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM DUAL
този път ще получим 34 (2-ро среща) и с помощта на 3 като последният параметър ще върне 45 и така нататък.
Използването на рекурсивно connected by заедно с level гарантира, че ще получите всички релевантни резултати (но не непременно в оригиналния ред!):
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
ще върне:
TOKEN
23
34
45
56
който не само съдържа всичките 4 резултата, но и го разделя на отделни редове в набора от резултати!
Ако щес цигулка с него - може да ви даде по-ясна представа за темата.