我想查找一列中不允许的字符。允许的字符为:
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
答案 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)
本身是连字符,我们可以在连字符的范围内放置连字符。
请注意,在上面的演示中,只有最终记录与您的模式不匹配。