SQL like - 选择包含未指定字符的字符串

时间:2013-09-12 08:58:41

标签: sql regex sql-like

首先,如果这是一个重复的问题,请道歉。我已尽力搜索但未成功,我甚至无法用关键字正确地提出问题!

我的一张桌子有一列Name (nvarchar)。我想找出哪些行包含特殊字符没有明确列出这些字符。在我的情况下,“特殊”字符表示不在的任何内容:

a-z A-Z 0-9 _ @ . , ( ) % + -

例如:

Row 1: 'asdf Asdf 0123'
Row 2: 'asdf (Asdf) 012/3'
Row 3: 'zxcv [234]'
Row 4: 'asdf #0123'

我想选择第2,3和4行。

最简单的方法是包含我不想要的字符,例如方括号和斜杠:

SELECT * FROM Table
WHERE Name LIKE '%[\]\[/]%' ESCAPE '\'

这会返回第2行和第3行,或者如果我使用NOT LIKE,则返回第1行和第4行。但是,我还想找到其他我可能没有想过的字符(例如#)。列出所需的字符 -

SELECT * FROM Table
WHERE Name NOT LIKE '%[a-zA-Z0-9_@. ,()%+-]%'

也不起作用,因为它返回0结果,因为所有行都至少包含其中一个字符。

有没有办法限制后面的LIKE语句不匹配包含我想要的字符的任何字符串,而是包含所需字符的字符串?

2 个答案:

答案 0 :(得分:2)

在MySQL中你可以这样做:

WHERE Name REGEX '[^-a-zA-Z0-9.,()%+]'

不确定SQL Server中是否存在相同的REGEX运算符,但它可能有类似的东西。

答案 1 :(得分:0)

SELECT * FROM tblWHERE PATINDEX('%[^a-zA-Z0-9]%',col) >1

应返回具有非字母数字字符的行。您可能需要根据您的特定需求更改正则表达式。

use tempdb
create table tbl ( col varchar(40) NULL)

insert into tbl VALUES ('lowercase')
insert into tbl VALUES ('UPPER')
insert into tbl VALUES ('0123')
insert into tbl VALUES ('special characters & ^')
insert into tbl VALUES ('special characters ! \/')
insert into tbl VALUES ('special characters _ + = ')
insert into tbl VALUES (NULL)

SELECT * FROM tbl WHERE PATINDEX('%[^a-zA-Z0-9]%',col) >1

drop table tbl