【问题标题】:Oracle: Connect by Level & regexp_substrOracle:按级别和 regexp_substr 连接
【发布时间】:2019-05-22 02:37:27
【问题描述】:

您好,我有一个不是我编写的 Oracle 查询,我也无权在 Oracle 环境中运行。

有人可以解释一下这个查询在做什么吗?

WITH tableName AS 
( SELECT regexp_substr(fieldName,'[^,]+',1,level) as tableName 
  FROM   (SELECT :tableName as fieldName From DUAL) 
  CONNECT BY LEVEL <= REGEXP_COUNT(fieldName ,'[,]')+1 )

我知道它正在创建一个名为 tableName 的 CTE,并且 Oracle 允许在不需要来自任何表的数据的查询中将 DUAL 指定为表。这样上述查询不会从任何特定表中提取。

但是我不明白查询的其余部分,因为我对 Oracle 很陌生。

任何帮助将不胜感激我尝试谷歌搜索但出现空白。

【问题讨论】:

    标签: oracle connect-by regexp-substr


    【解决方案1】:

    警告:如果列表中有 NULL 元素,则使用通用正则表达式 '[^,]+' 解析字符串不会返回预期值。元素将在 NULL 元素之后的错误位置。请注意,第二个元素是 NULL,但在结果集中,元素被返回到错误的位置:

    SQL> select level, regexp_substr('emp,,bonus,salgrade','[^,]+',1,level) as tableName
           from dual
           connect by LEVEL <= REGEXP_COUNT('emp,,bonus,salgrade' ,',') + 1;
    
         LEVEL TABLENAME
    ---------- -------------------
             1 emp
             2 bonus
             3 salgrade
             4
    

    使用这种形式的 REGXP_SUBSTR() 来代替处理 NULL:

    SQL> select level, regexp_substr('emp,,bonus,salgrade','(.*?)(,|$)',1,level, NULL, 1) as tableName
           from dual
           connect by LEVEL <= REGEXP_COUNT('emp,,bonus,salgrade' ,',') + 1;
    
         LEVEL TABLENAME
    ---------- -------------------
             1 emp
             2
             3 bonus
             4 salgrade
    

    See this post for more info

    【讨论】:

      【解决方案2】:

      它将逗号分隔的值字符串拆分为行。例如(稍作修改以便在 SQL*Plus 中工作):

      SQL> with tableName AS
        2   ( SELECT regexp_substr(fieldName,'[^,]+',1,level) as tableName
        3     FROM (SELECT '&tableName' as fieldName From DUAL)
        4     CONNECT BY LEVEL <= REGEXP_COUNT(fieldName ,'[,]')+1 )
        5  select * From tablename;
      Enter value for tablename: little,foot,overflow
      
      TABLENAME
      ----------------------------------------------------------------------
      little
      foot
      overflow
      
      SQL>
      

      更简单/更短的版本:

      SQL> select level, regexp_substr('&&fieldName','[^,]+',1,level) as tableName
        2  from dual
        3  connect by LEVEL <= REGEXP_COUNT('&&fieldName' ,'[,]') + 1;
      Enter value for fieldname: emp,dept,bonus,salgrade
      
           LEVEL TABLENAME
      ---------- --------------------
               1 emp
               2 dept
               3 bonus
               4 salgrade
      
      SQL>
      

      那么,它有什么作用? REGEXP_COUNT 计算分隔符的数量(在这种情况下为逗号),它用于CONNECT BY,这与层次查询相关,其LEVEL 伪列(我将其包含在第二个示例的输出中)用于REGEXP_SUBSTR作为它的第四个参数,occurrence

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        • 2013-10-12
        • 2014-08-28
        • 2016-05-22
        • 2014-05-28
        相关资源
        最近更新 更多