sql - Oracle sql 终止符筛选(+奇怪的行为)

标签 sql regex oracle exception

我有一个疑问,请说这个

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/

相关文章:

sql - "table that is a parent of a referential integrity constraint"对于 oracle SQL 有什么作用?

oracle - Oracle NUMBER 类型是否可能溢出?

oracle - 在哪里可以查询oracle数据库的大小写敏感度?

sql - 将子记录添加到新列而不是新行

php - IN() 函数不使用百分号返回结果

javascript - 正则表达式将数字与可能的字母匹配

python - 用 Python re 替换为自定义函数

php - 如何在 PHP 中使用正则表达式匹配嵌套的大括号?

php - 表行字段的mysql if else语句

sql - 选择一个值而不是另一个