在Oracle 11g中,如何在正则表达式中检测空字符(chr(0)
)?
我希望以下条件评估为true,但它不会:
select case when regexp_like (chr(0), '\0') then 1 else 0 end from dual;
我的特定用例需要检测varchar2列中的空字符模式:
select * from my_table where NOT regexp_like (my_column, '^[\s\0]+$');
答案 0 :(得分:1)
您可以使用[:cntrl:]
字符类。
SELECT
CASE
WHEN regexp_like (chr(0), '[[:cntrl:]]')
THEN 1
ELSE 0
END control_chr
FROM dual;
CONTROL_CHR
-----------
1
答案 1 :(得分:1)
我为这个问题做了一些研究。 chr(0)是一个在任何地方造成混乱的事情。
我首先创建了一个表,在其中插入了一个带有chr(0)的字符串,并尝试使用regexp_like找到它。
CREATE TABLE t1(col1 VARCHAR2(10));
INSERT INTO t1 VALUES('01234' || chr(0) || '5678');
SELECT CASE WHEN REGEXP_LIKE(col1,CHR(0)) THEN 1 ELSE 0 END op,col1, dump(col1) FROM t1;
输出低于 -
op col1 dump(col1)
---- ----- -------------------------------------------------
1 01234 Typ=1 Len=10: 48,49,50,51,52,0,53,54,55,56
正如您所见,转储显示实际上chr(0)在那里,虽然在屏幕上显示字符串时,该工具将chr(0)视为空终止符并且不显示其余的。因此,似乎regexp_like 实际上在字符串中找到chr(0)的匹配项。
但令我沮丧的是,我发现即使是没有chr(0)的字符串也会返回相同的结果。
DELETE FROM t1;
INSERT INTO t1 VALUES('0123456789');
SELECT CASE WHEN REGEXP_LIKE(col1,CHR(0)) THEN 1 ELSE 0 END op,col1, dump(col1) FROM t1;
op col1 dump(col1)
----- ------- ----------------------------------------------------
1 0123456789 Typ=1 Len=10: 48,49,50,51,52,53,54,55,56,57
所以有一些东西可以处理chr(0)。我发布了以下问题并得到了同样的解释。 chr(0)是一个零长度的字符串,每当我们试图在字符串中找到它时,它显然会在任何地方找到它,实际上找不到它。
似乎无法在字符串中找到chr(0)。请参阅MTO的回复。
答案 2 :(得分:1)
您可以LIKE
或INSTR
使用CHR(0)
来检测它,但REGEXP_LIKE
无效,因为它会特别处理CHR(0)
。
create table t1 (col1 varchar2(10));
insert into t1 values ('01234'||chr(0)||'5678');
insert into t1 values ('01234X5678');
select case when col1 like '%'||chr(0)||'%' then 1 else 0 end r, col1, dump(col1) from t1;
select case when instr(col1,chr(0)) > 0 then 1 else 0 end r, col1, dump(col1) from t1;
上述两个查询都显示以下结果:
select case when regexp_like(col1,chr(0)) then 1 else 0 end r, col1, dump(col1) from t1;
这给出了以下结果:
您需要小心,因为有些客户在遇到CHR(0)
时会停止阅读字符串。例如,当我尝试从SQL Developer的查询结果网格中复制并粘贴时,它就在那时停止了。
答案 3 :(得分:1)
似乎无法仅识别Oracle正则表达式中的空字符。 Oracle's Regular Expression reference documentation表示支持正则表达式,并且没有提及支持标识空字符的元字符或表达式(尽管支持其他标准元字符的子集)。我的测试证实了这一点,因为在这个帖子中有其他人执行了后续测试。
虽然这个问题的答案是不可能的,但其他一些答案可能有助于满足其他人的需求。用例。特别是,请参阅此answer建议使用[[:cntrl:]]
类。这将识别正则表达式中的空字符,尽管它也会匹配类中的其他字符。