【问题标题】:Underscore in Where clause yields unexpected result, why? [duplicate]Where 子句中的下划线会产生意想不到的结果,为什么? [复制]
【发布时间】:2019-11-08 10:46:32
【问题描述】:

我想查找所有以TB_ 开头的表格,因此我编写了以下脚本:

select *
from INFORMATION_SCHEMA.TABLES
where TABLE_NAME like 'TB_%'

令我惊讶的是,我得到了以下结果:

TB103_xxx
TB037_bbb
TB104_ccc

我很好奇为什么?

【问题讨论】:

    标签: sql-server tsql sql-server-2016 sql-like


    【解决方案1】:

    它表示任何单个字符与like 的组合。见

    MSDN - LIKE (Transact-SQL)

    • % - 零个或多个字符的任意字符串。
    • _ - 任何单个字符。 _a 将匹配 aaba 等。
    • [ ] - 指定范围 ([a-f]) 或集合 ([abcdef]) 内的任何单个字符。
    • [^] - 任何不在指定范围 ([^a-f]) 或集合 ([^abcdef]) 内的单个字符。

    你可以使用[_] 来匹配下划线,所以like 'TB[_]%'

    或者你可以使用LIKE 'TB\_%' ESCAPE '\'.(感谢 Jeroen Mostert)

    【讨论】:

    • 哇,你好快,刚发现下划线代表单个字符。例如,以下语句返回第二个字符是字母 u 的客户:
    • 但是,如果您在字符串中搜索实际的下划线或百分比字符,您应该使用 T-SQL 转义序列 [%] 或 [_]。
    • @krul - 您需要转义 ([_]) 下划线以获得带下划线的结果
    • 除了[_],您还可以使用LIKE 'TB\_%' ESCAPE '\' 显式转义。请注意,如果没有提供 ESCAPE 子句,则没有默认转义字符。
    • @JeroenMostert 感谢您指出这一点;多么奇怪的语法,以前从未见过
    【解决方案2】:

    这就是您使用下划线 (_) 符号的原因。这意味着字符串允许您匹配单个字符。 检查这个SQL LIKE Operator

    最好使用WHERE COLUMN_NAME LIKE 'TB[_]%'WHERE COLUMN_NAME LIKE 'TB\_%'

    % - 百分号表示零、一个或多个字符。

    _ - 下划线代表单个字符。

    [] - 指定范围 ([a-f]) 或集合 ([abcdef]) 内的任何单个字符。

    [^] - 任何不在指定范围 ([^a-f]) 或集合 ([^abcdef]) 内的单个字符。

    这里有一些例子

    WHERE CustomerName LIKE 'a%'           Finds any values that start with "a"
    WHERE CustomerName LIKE '%a'           Finds any values that end with "a"
    WHERE CustomerName LIKE '%or%'         Finds any values that have "or" in any position
    WHERE CustomerName LIKE '_r%'          Finds any values that have "r" in the second position
    WHERE CustomerName LIKE 'a_%'          Finds any values that start with "a" and are at least 2 characters in length
    WHERE CustomerName LIKE 'a%o'          Finds any values that start with "a" and ends with "o"
    WHERE CustomerName LIKE '[a-e]arsen'   Finds any values that end with "arsen" and starting with any single character between "a" and "e"
    WHERE CustomerName LIKE '[^a-e]arsen'  Finds any values that end with "arsen" and starting with any single character isn't between "a" and "e".
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多