查找超出指定字符范围的字符

时间:2019-02-21 14:12:30

标签: sql sql-server sql-server-2012 sql-like

我想查找一列中不允许的字符。允许的字符为:

A-Z
0-9
空格(CHAR 32)
-(CHAR 45)

因此,VARCHAR列RegNo中不允许其他所有内容。 但是问题是,在过去的几年中,没有对输入进行过滤。 因此,所有奇怪的字符都已存储在数据库中。

我想找到这些情况并加以解决。 所以我的第一次尝试

select regno from vehicle where regno like '%[^A-Z][^0-9][^-][^' + char(32) + ']%'

结果

Wiiks Luleå
SCÖ-01
NCÅ-01
668 AOJ
016 KMW
049 KMW

第一行就可以了,因为它包含“å”

但是为什么要选择668 AOJ,016 KMW,049 KMW

2 个答案:

答案 0 :(得分:2)

您错误地使用了字符类。例如,%[^A-Z][^0-9]%将匹配x y,其中空格匹配[^A-Z],y匹配[^0-9]。像这样将它们组合在一起:

WHERE RegNo LIKE '%[^A-Z0-9\- ]%' ESCAPE '\'
WHERE RegNo LIKE '%[^ABCDEFGHIJKLMNOPQRSTUVWXYZ0-9\- ]%' ESCAPE '\'

注意:

  • ^-]中使用字符[]时应转义
  • 字符范围可以包括其他字符,例如重音符号。指定一个集合,而不是范围。

答案 1 :(得分:2)

您在这里遇到几个问题。首先,您应该使用单个正则表达式字符类,而不是其中的几个,它们试图匹配多个不同的字符。接下来,您的范围本身存在问题。试试这个版本:

SELECT regno
FROM vehicle
WHERE regno LIKE '%[^A-Z0-9 ' + CHAR(32) + '-' + CHAR(44) + '-]%';

为解释上述范围,它匹配任何字符为 not 大写字母,数字,空格或范围为{{1}的regno }。请注意,CHAR(32) - CHAR(44)本身是连字符,我们可以在连字符的范围内放置连字符。

Demo

请注意,在上面的演示中,只有最终记录与您的模式不匹配。

相关问题