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

时间:2013-10-20 21:58:05

标签: sql regex oracle

这真的开始受伤了!

我正在尝试使用正则表达式条件在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';

除了单引号外,不包括任何预期的内容。在使用单引号字符时,Oracvel SQL Develoepr解析器将其作为文字。

我试过了:

\' -- 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 个答案:

答案 0 :(得分:4)

以下作品:

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

See this SQLFiddle

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

分享并享受。

答案 1 :(得分:4)

只需加倍单引号即可逃避报价。

所以

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

另见sqlfiddle。注意,我在SQL开发人员中尝试过类似的查询,并且效果不错。

另请注意,为此,-字符必须是组中的最后一个字符,否则它会尝试查找组SPACE'而不是字符{ {1}}。