我有一个疑问,请说这个
SELECT to_char(regexp_substr(q'{select * from dual minus select * from dual; select * from dual minus select * from dual;}'
, '[^;]+', 1, LEVEL)) FROM dual
CONNECT BY to_char(regexp_substr(q'{select * from dual minus select * from dual; select * from dual minus select * from dual;}', '[^;]+', 1, LEVEL)) IS NOT NULL;
它工作正常 - 分割我的行
select * from dual minus select * from dual; select * from dual minus select * from dual;
一分为二
select * from dual minus select * from dual
select * from dual minus select * from dual
一切都很好,直到我添加一些线制动器,就像这样
SELECT to_char(regexp_substr(q'{select * from dual minus select * from dual;
select * from dual minus select * from dual;}'
, '[^;]+', 1, LEVEL)) FROM dual
CONNECT BY to_char(regexp_substr(q'{select * from dual minus select * from dual;
select * from dual minus select * from dual;}', '[^;]+', 1, LEVEL)) IS NOT NULL;
这里就变成了 hell :sql 将字符串中的 ;
视为查询的实际结束,ORA-01756 之类的东西......
如果我在 ;
之后添加一个随机符号,一切都会恢复正常
SELECT to_char(regexp_substr(q'{select * from dual minus select * from dual;%
select * from dual minus select * from dual;}'
, '[^;]+', 1, LEVEL)) FROM dual
CONNECT BY to_char(regexp_substr(q'{select * from dual minus select * from dual;%
select * from dual minus select * from dual;}', '[^;]+', 1, LEVEL)) IS NOT NULL;
请解释此行为并提出解决方法。
UPD:在不同的 IDE 中尝试过此操作(SQL 开发人员而不是 PL/SQL 开发人员)。没有错误。也许这一切都与编码有关......
UPD2:在这种情况下,SQLPlus 的工作方式与 PL/SQL 开发人员的工作方式相同。 SQL 开发人员似乎更“聪明”一些。尽管如此,还是不知道为什么。
最佳答案
尝试:
SELECT to_char(regexp_substr(q'{select * from dual minus select * from dual;
select * from dual minus select * from dual;}'
, '[^;[:cntrl:]]+', 1, LEVEL)) FROM dual
CONNECT BY to_char(regexp_substr(q'{select * from dual minus select * from dual;
select * from dual minus select * from dual;}', '[^;[:cntrl:]]+', 1, LEVEL)) IS NOT NULL;
输出:
select * from dual minus select * from dual
select * from dual minus select * from dual
原因是 regexp_substr 查找您指定的下一个模式,在您的情况下最初是 [^;]+ 并且该模式会找到 ;下一个字符将是换行符。如果您想像这样分解行,简单的解决方案是通过 [:cntrl:] 在正则表达式搜索中排除控制字符
关于sql - Oracle sql 终止符筛选(+奇怪的行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486080/