2

首先,如果这是一个重复的问题,我们深表歉意。我已经尽力搜索但没有成功,我什至无法用关键字正确地表达我的问题!

我的一张桌子有一列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 个结果,因为所有行都至少包含 1 个这些字符。

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

4

2 回答 2

2

在 MySQL 中,您可以执行以下操作:

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

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

于 2013-09-12T09:05:17.427 回答
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
于 2013-09-12T09:13:47.787 回答