【问题标题】:SQL like - select strings that contain unspecified charactersSQL like - 选择包含未指定字符的字符串
【发布时间】:2013-09-12 08:58:41
【问题描述】:

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

我的一张桌子有一列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 语句不匹配包含我想要的字符的 any 字符串,而是包含 only 想要的字符而不匹配其他任何内容的字符串?

【问题讨论】:

  • 您使用的是什么 DBMS?
  • SQL 服务器,但我认为这不应该依赖于 DBMS。另外,我想我刚刚找到了一个解决方案,如果正确我会发布。

标签: sql regex sql-like


【解决方案1】:

在 MySQL 中你可以这样做:

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

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

【讨论】:

  • 刚刚按照本页w3schools.com/sql/sql_wildcards.asp 做了WHERE Name LIKE '%[^a-zA-Z0-9_@. ,()%+-]%'。在问这个问题之前,我已经看到 - 并尝试过 - 但由于某种原因没有做对。无论哪种方式,这几乎就是我想要的,所以谢谢! :)
【解决方案2】:

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

【讨论】:

  • 我认为这太复杂了;我使用了 LIKE 和 ^ 通配符,如此处所示 w3schools.com/sql/sql_wildcards.asp 。不管怎么说,还是要谢谢你! :)
  • 我会检查 LIKEPATINDEX 的性能 - 实际上它并不比 like 复杂,只是一个函数调用而不是谓词。我已经阅读了关于这两种方法的相对性能的混合结果,其中一种可能会给你更快的结果......
  • 我的意思是更长、更难编写/理解 :) 该脚本需要与只使用一次的其他人共享,所以我主要关心的是简单性/可读性,而不是性能。
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2011-04-09
相关资源
最近更新 更多