【问题标题】:Find characters outside specified character range查找指定字符范围之外的字符
【发布时间】:2019-02-21 14:12:30
【问题描述】:

我想查找列中不允许出现的字符。允许的字符是:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    对于上述范围的解释,它匹配任何具有非大写字母、数字、空格或在范围CHAR(32) - CHAR(44) 中的字符的regno。请注意,CHAR(45) 本身是一个连字符,我们可以将其放在范围的最范围内以包含它。

    Demo

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

    【讨论】:

      【解决方案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 '\'
      

      注意事项:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多