Connect by clause в regex_substr

Я не могу понять это утверждение - не eveN после googling вокруг

 
pv_no_list :='23,34,45,56';
SELECT   DISTINCT REGEXP_SUBSTR (pv_no_list,
                                                     '[^,]+',
                                                     1,
                                                     LEVEL)
                                         no_list
                      FROM   DUAL
                CONNECT BY   REGEXP_SUBSTR (pv_no_list,
                                            '[^,]+',
                                            1,
                                            LEVEL) IS NOT NULL

Ответ 1

"Оскорбление" (как выразился Колин Херт Харт) connected by имеет здесь хорошую цель: используя REGEXP_SUBSTR, вы можете извлечь только одно из 4 совпадений (23,34,45,56): regex [^,]+ соответствует любой последовательности символов в строке, которая не содержит запятой.

Если вы попытаетесь запустить:

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 (что является значением по умолчанию), и верните первое вхождение.

Теперь можно запустить:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM   DUAL

на этот раз мы получим 34 (второе вхождение) и используя 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 результата, но также разбивает его на отдельные строки в наборе результатов!

Если вы fiddle, это может дать вам более четкое представление о предмете.

Ответ 2

connect by не имеет ничего общего с regex_substr:

Этот запрос "злоупотребляет" функциональностью connect by для генерации строк в запросе на dual. Пока выражение, переданное в connect by, истинно, оно создаст новую строку и увеличит значение псевдо столбца LEVEL.

Затем LEVEL передается в regex_substr для получения n-го значения при применении регулярного выражения.