Как создать новые записи из одной записи с полем значения через запятую с использованием SQL (в Oracle Database) - PullRequest
0 голосов
/ 02 мая 2018

Предположим, у меня есть одна запись в Таблица 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

1 Ответ

0 голосов
/ 02 мая 2018

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

...