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

类SQL-选择包含未指定字符的字符串,sql,regex,sql-like,Sql,Regex,Sql Like,首先,如果这是一个重复的问题,请道歉。我已经尽了最大的努力去搜索,但是没有成功,我甚至不能用关键词来恰当地表达我的问题 我的一个表有一个列名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 #

首先,如果这是一个重复的问题,请道歉。我已经尽了最大的努力去搜索,但是没有成功,我甚至不能用关键词来恰当地表达我的问题

我的一个表有一个列名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个字符

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

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

WHERE Name REGEX '[^-a-zA-Z0-9.,()%+]'
不确定SQL Server中是否存在相同的正则表达式运算符,但它可能具有类似的内容。

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

您使用的是什么DBMS?SQL server,但我认为这不应该依赖于DBMS。另外,我想我刚刚找到了一个解决方案,如果正确的话,我会发布它。根据本页,我刚刚找到了像“%[^a-zA-Z0-9\@,%+-]%”这样的名称。在提出这个问题之前,我已经看到并尝试过这个问题,但由于某种原因,我没有正确地回答。不管怎样,这正是我想要的,谢谢我认为这是不必要的复杂;我使用了LIKE和^通配符,如图所示。无论如何,谢谢!:我会检查一下LIKE vs PATINDEX的性能——它并不比LIKE更复杂,只是一个函数调用而不是谓词。我读过关于这两种方法的相对性能的混合结果,其中一种可能会给你更快的结果……我的意思是更长、更难编写/理解:脚本需要与只使用一次的其他人共享,所以我主要关心的是简单性/可读性,而不是性能。