【问题标题】:How to create new records from a single record with a comma delimited value field using SQL (in Oracle Database)如何使用 SQL(在 Oracle 数据库中)从具有逗号分隔值字段的单个记录创建新记录
【发布时间】: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 &lt;= mx
  • 谢谢尼克,我会调查的。

标签: sql oracle cross-join rownum regexp-replace


【解决方案1】:

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...),那么它们可用于挖掘字符串,例如“查找第一个字符,查找第二个字符”或“查找第一个单词,查找第二个词”等....

我在此处制作了有关该主题的视频

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

【讨论】:

  • 谢谢康纳。很有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2012-07-26
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2019-02-27
相关资源
最近更新 更多