如何使用 SQL 从具有逗号分隔值字段的单个记录创建新记录(在 Oracle 数据库中)

How to create new records from a single record with a comma delimited value field using SQL (in Oracle Database)

假设我在 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

CONNECT BY 'intended' 用于导航层次结构,例如

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

但不久前,人们研究它可以用来遍历 "fictional" 层次结构,

  • 意识到 START WITH 是可选的
  • 给出'always true'连接条件

所以我们可以采用上面的方法

select ...
from   EMP
connect by 1 = 1 

你会 'walk' 一个永远的等级制度!那么我们可以将其变形为:

select rownum
from   dual
connect by 1=1

并得到整数 1,2,3, ... 到无穷大。从那里,我们只需添加一个终止条件,例如

select rownum
from   dual
connect by level <= 10

因为每次我们遍历 "hierarchy"

时 'level' 都会上升

如果你有整数 (1,2,3,4...) 那么它们可以用来挖掘字符串,例如 "find the 1st character, find the 2nd character" 或 "find the 1st word, find the 2nd word" 等 ....

我在这里制作了一个关于这个主题的视频

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