Oracle:按级别连接 & regexp_substr

Oracle: Connect by Level & regexp_substr

您好,我有一个不是我编写的 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 允许在不需要任何 table 数据的查询中将 DUAL 指定为 table秒。这样上面的查询就不会从任何特定的 table.

中提取

但是,由于我对 Oracle 还很陌生,所以我不理解查询的其余部分。

任何帮助将不胜感激我尝试谷歌搜索但一无所获。

它将逗号分隔值字符串拆分成行。例如(稍作修改,使其适用于 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>

一个simpler/shorter版本:

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.

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

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