Как создавать новые записи из одной записи с полем значений, разделенным запятыми, с помощью SQL (в базе данных Oracle)

Предположим, у меня есть одна запись в Table test_tabfile, где поле default_sort содержит значения, разделенные запятыми:

table_name     schema_name     default_sort
------------   -------------   -------------------------------------- 
Population     2017            GEOTYPE, STATE, COUNTY, ZIP, MSA, CSA

Следующий устаревший скрипт SQL разделяет значения в поле default_sort и создает новые записи с полем отдельных значений, index_column. Как это достигается?

Я пытаюсь понять это и переписать более интуитивно. Спасибо.

SELECT schema_name AS schemaname,
       table_name AS tablename,
       REGEXP_SUBSTR (default_sort, '[^,]+', 1, rn) AS index_column
  FROM test_tabfile
       CROSS JOIN
       (    SELECT ROWNUM rn
              FROM (SELECT   MAX (LENGTH (REGEXP_REPLACE (default_sort, '[^,]+'))) + 1 mx
                      FROM test_tabfile)
        CONNECT BY LEVEL <= mx);

Вот пример выходных данных:

Schmemaname  tablename    index_column
-----------  -----------  ------------
2017         Population   GEOTYPE
2017         Population   STATE
2017         Population   COUNTY
2017         Population   ZIP
2017         Population   MSA
2017         Population   CSA

person Hank    schedule 01.05.2018    source источник
comment
Такие вещи очень специфичны для платформы. Я думаю, что CONNECT BY LEVEL это Oracle. Я добавлю тег Oracle   -  person Nick.McDermaid    schedule 02.05.2018
comment
Вы можете начать понимать его, прогоняя отдельные фрагменты как свои собственные. то есть взгляните на этот результат: SELECT ROWNUM rn FROM (SELECT MAX (LENGTH (REGEXP_REPLACE (default_sort, '[^,]+'))) + 1 mx FROM test_tabfile) CONNECT BY LEVEL <= mx   -  person Nick.McDermaid    schedule 02.05.2018
comment
Спасибо, Ник, я посмотрю на это.   -  person Hank    schedule 03.05.2018


Ответы (1)


CONNECT BY предназначен для использования для навигации по иерархии, например

select ...
from   EMP
start with MGR is null  -- ie, the CEO
connect by prior MGR = EMPNO   -- ie, link an employee to his manager

но некоторое время назад люди работали, его можно было использовать для обхода «вымышленной» иерархии,

  • понимая, что START WITH не является обязательным
  • предоставление «всегда истинного» условия для подключения

Таким образом, мы могли бы взять вышеизложенное и сделать

select ...
from   EMP
connect by 1 = 1 

и вы будете «ходить» по иерархии вечно! Итак, мы могли бы преобразовать это в:

select rownum
from   dual
connect by 1=1

и получить целые числа 1,2,3,... до бесконечности. И оттуда мы просто добавляем завершающее условие, например

select rownum
from   dual
connect by level <= 10

потому что «уровень» повышается каждый раз, когда мы пересекаем «иерархию»

И если у вас есть целые числа (1,2,3,4...), то их можно использовать для поиска в строках, например, «найти 1-й символ, найти 2-й символ» или «найти 1-е слово, найти 2-е слово». " так далее ....

Я сделал видео на эту тему здесь

https://www.youtube.com/watch?v=UonikfFgEyM

person Connor McDonald    schedule 02.05.2018
comment
Спасибо, Коннор. Это полезно. - person Hank; 03.05.2018