首页 > 解决方案 > 如何使用 SQL ORACLE 解析列值

问题描述

我正在使用 ORACLE(版本?)。

我有一个表 mytable ,其中有一列 COL_LIST 包含由 '/' 分隔的连接值:

COL_LIST

06130/06520
06000/06100/06200/06300

使用 SQL,我想用 COL_LIST 和一个新列 COL 创建另一个表,例如:

COL    COL_LIST

06130  06130/06520
06520  06130/06520
06000  06000/06100/06200/06300
06100  06000/06100/06200/06300
06200  06000/06100/06200/06300
06300  06000/06100/06200/06300

使用 :

SELECT col_list ,
       REGEXP_SUBSTR( col_list , '[^/]+' , 1 , LEVEL )  AS col
  FROM mytable
CONNECT BY REGEXP_SUBSTR( col_list , '[^/]+' , 1 , LEVEL ) IS NOT NULL

如果我在 MYTABLE 的 COL_LIST 中只有一个值(例如 06130/06520 ),则工作正常,但如果没有,结果不是我所期望的。

关于案件的任何提示?

标签: sqlstringoraclecsvrecursive-query

解决方案


您不能这样使用connect by:它会复制行并且不会产生您想要的结果。

从您现有的查询开始,并假设 Oracle 12c 或更高版本,您可以使用横向连接解决此问题:

select t.col_list, x.col
from mytable t
cross apply (
    select regexp_substr(t.col_list , '[^/]+', 1, level) as col
    from dual
    connect by regexp_substr(t.col_list , '[^/]+', 1, level) is not null
) x

推荐阅读