Разбор/парсинг значения поля (строки) по разделителям на строки

Простой пример того, о чем речь:

SELECT regexp_substr(str, '[^#]+', 1, LEVEL)
  FROM (SELECT 'one#two#tree' str FROM dual)
CONNECT BY instr(str, '#', 1, LEVEL-1) > 0

напоминалка:

  • ‘[^#]+’ такая маска найдет все символы кроме решетки
  • instr(str, ‘#’, 1, LEVEL-1) > 0 поиск позиции разделителя начиная с первой позиции и, видимо, с LEVEL = 2 (возвратит 0 если позиция при заданных параметрах не найдена)
  • CONNECT BY условие подсказывает ораклу как долго продолжать цикл

Результат:

1	one
2	two
3	tree

Также бывает вариант (причем гораздо чаще), когда необходимо разобрать не одну строку, а целую кучу строк :) , тогда можно сделать так:

SELECT regexp_substr(t.value, '[^]]+', 1, LEVEL) || ']' str, t.id
  FROM (SELECT tt.id, tt.value
          FROM test_table tt) t
CONNECT BY instr(TRIM(']' FROM t.value), ']', 1, LEVEL - 1) > 0
       AND PRIOR t.id = t.id
       AND PRIOR dbms_random.value IS NOT NULL

данные в таблице test_table:

ID	VALUE
1	[one][two][three]
2	[four][five][six]

Результат выполнения запроса:

STR		ID
[one]		1
[two]		1
[three]		1
[four]		2
[five]		2
[six]		2

Т.е. в этом примере была разобрана строка содержащая склеенные данные в виде строк в квадратных скобках.

Полезные ссылки на тему двух не очевидных для меня фильтров PRIOR t.id = t.id и PRIOR dbms_random.value IS NOT NULL:

Оставить комментарий