Ответ 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, это может дать вам более четкое представление о предмете.