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
您好,我有一个不是我编写的 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