首先,如果这是一个重复的问题,请道歉。我已尽力搜索但未成功,我甚至无法用关键字正确地提出问题!
我的一张桌子有一列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语句不匹配包含我想要的字符的任何字符串,而是包含仅所需字符的字符串?
答案 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