如何使用 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" 等 ....
我在这里制作了一个关于这个主题的视频
假设我在 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" 等 ....
我在这里制作了一个关于这个主题的视频