【问题标题】:How to parse column values with SQL ORACLE如何使用 SQL ORACLE 解析列值
【发布时间】:2021-03-13 14:04:37
【问题描述】:

我正在使用 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 ),则工作正常,但如果没有,则结果不是我所期望的。

关于此案的任何提示?

【问题讨论】:

    标签: sql string oracle csv recursive-query


    【解决方案1】:

    你也可以试试这个解决方案:

    SELECT distinct col_list col_lst, REGEXP_SUBSTR( col_list , '[^/]+' , 1 , LEVEL ) col_val,  level lvl
      FROM col_single
    CONNECT BY level <=  REGEXP_count( col_list , '[^/]+' , level)
    order by col_lst desc, lvl;
    
    

    【讨论】:

      【解决方案2】:

      如果您不是 12c 或更高版本,那么:

      SQL> select regexp_substr(col_list, '[^/]+', 1, column_value) col,
        2         col_list
        3  from mytable cross join
        4    table(cast(multiset(select level
        5                        from dual
        6                        connect by level <= regexp_count(col_list, '/') + 1
        7                       ) as sys.odcinumberlist))
        8  order by col_list desc, 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
      
      6 rows selected.
      
      SQL>
      

      【讨论】:

        【解决方案3】:

        你不能像那样使用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
        

        【讨论】:

          猜你喜欢
          • 2016-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-14
          • 2021-08-03
          • 1970-01-01
          • 2015-04-03
          • 2013-01-07
          相关资源
          最近更新 更多