如何使用SQL(在Oracle数据库中)从具有逗号分隔值字段的单个记录创建新记录
假设我在表test_tabfile中有一条记录,默认的排序字段包含逗号分隔的值:如何使用SQL(在Oracle数据库中)从具有逗号分隔值字段的单个记录创建新记录,sql,oracle,cross-join,rownum,regexp-replace,Sql,Oracle,Cross Join,Rownum,Regexp Replace,假设我在表test_tabfile中有一条记录,默认的排序字段包含逗号分隔的值: table_name schema_name default_sort ------------ ------------- -------------------------------------- Population 2017 GEOTYPE, STATE, COUNTY, ZIP, MSA, CSA 以下传统SQL脚本分离默认排序字段中的值,并创建
table_name schema_name default_sort
------------ ------------- --------------------------------------
Population 2017 GEOTYPE, STATE, COUNTY, ZIP, MSA, CSA
以下传统SQL脚本分离默认排序字段中的值,并创建具有不同值字段、索引列的新记录。它是如何做到这一点的
我试图更直观地理解它并重写它。谢谢
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);
“连接方式”用于导航层次结构,例如
select ...
from EMP
start with MGR is null -- ie, the CEO
connect by prior MGR = EMPNO -- ie, link an employee to his manager
但不久前,人们工作过,它可以用来穿越一个虚构的等级制度,通过
认识到从开始是可选的
为连接提供“始终为真”的条件
因此,我们可以采取上述行动
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。。。然后他们可以用来挖掘字符串,例如找到第一个字符,找到第二个字符,或者找到第一个单词,找到第二个单词等等
我在这里做了一个关于这个主题的视频
这类事情非常特定于平台。我认为按级别连接是Oracle。我将添加Oracle标记,您可以通过自己运行片段来开始理解它。i、 e.看看这个结果:从SELECT MAX LENGTH REGEXP中选择ROWNUM rn_REPLACE default_sort,[^,]+'+1 mx从test_tabfile按级别连接谢谢Nick,我会调查的。谢谢Connor。这很有帮助。
select rownum
from dual
connect by level <= 10