"Злоупотребата" (както го изрази Колин 'т Харт) на 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 резултата, но и го разделя на отделни редове в набора от резултати!
Ако щес цигулка с него - може да ви даде по-ясна представа за темата.