【发布时间】:2018-10-11 23:51:02
【问题描述】:
假设我在 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 LEVEL是甲骨文。我将添加 Oracle 标记 -
您可以通过自己运行片段来开始理解它。即看看这个结果:
SELECT ROWNUM rn FROM (SELECT MAX (LENGTH (REGEXP_REPLACE (default_sort, '[^,]+'))) + 1 mx FROM test_tabfile) CONNECT BY LEVEL <= mx -
谢谢尼克,我会调查的。
标签: sql oracle cross-join rownum regexp-replace