在Oracle正则表达式查询中转义单引号

5

这真的开始让人痛苦了!

我正在尝试使用正则表达式条件在Oracle开发者中编写查询。

我的目标是查找所有包含非常规字符(非字母、空格、连字符和单引号)的姓氏。

例如,我需要查找:

J00ls
McDonald "Macca"
Smithy (Smith)

并且没有找到

Smith
Mckenzie-Smith
El Hassan
O'Dowd

我现在的问题是

select * from dm_name 
WHERE regexp_like(last_name, '([^A-Za-z -])')
and batch_id = 'ATEST';

该语句排除了除单引号以外的所有字符。在输入单引号字符时,Oracle SQL Developer解析器将其视为文字。

我尝试过:

\' -- but got a "missing right parenthesis" error
||chr(39)|| -- but the search returned nothing
'' -- negated the previous character in the matching group e.g. '([^A-Za-z -''])' made names with '-' return.

我很感激您所提供的任何帮助。
2个回答

6

只需要将单引号加倍即可转义您的引号。

因此

select *
  from dm_name
 where regexp_like(last_name, '[^A-Za-z ''-]')
   and batch_id = 'ATEST'

请参考此SQLFiddle。请注意,我在SQL开发者中尝试了类似的查询,它也能正常工作,就像这个SQLFiddle一样。
还要注意,为了使其正常工作,-字符必须是组中的最后一个字符,否则它会尝试查找组SPACE'而不是字符-

5
以下内容可行:
select * 
  from dm_name 
  WHERE regexp_like(last_name, '([^A-Za-z ''-])');

请查看这个 SQLFiddle

我无法证明 SQL Developer 是否喜欢它,因为我没有安装那个产品。

分享并享受吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接