【问题标题】:SQL Server LIKE search with [ ] not matching as expected使用 [ ] 的 SQL Server LIKE 搜索与预期不匹配
【发布时间】:2015-07-21 15:12:42
【问题描述】:

我正在尝试在 SQL Server 数据库中搜索 text 列的内容。我没有能力为列添加全文索引,所以我试图在查询中这样做:

SELECT t.DateBegin, t.Action, t.Detail, t.Status, t.ErrorText, 
  CASE WHEN t.ErrorText LIKE '%[IBM][CLI Driver][DB2/LINUXX8664]%' THEN 'IBM'
   WHEN t.ErrorText LIKE '%WebApplicationContainerServer%' THEN 'WACS'
  ELSE '' END AS ErrorType
FROM (
SELECT a.DateBegin, a.Action, a.Detail, a.Status,  
CONVERT(varchar(max), 
    REPLACE(REPLACE(CAST(a.ExtInfo AS varchar(max)), CHAR(13), ' '), CHAR(10), ' ')
) as ErrorText
FROM bi4infoburst.dbo.IBT_RTS_ACTION a
WHERE a.DateBegin >= DATEADD(day, -7, GETDATE())
  AND a.Status = 5
) t
ORDER BY t.DateBegin

我的想法是,如果我将其转换为varchar,那么我可以使用 LIKE 运算符。但是当我运行这个查询时,无论我输入什么文本或模式,它总是匹配第一个案例。

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    这是character escaping 的问题。

    必须正确处理方括号,否则会被解释为特殊字符,如% is;使用方括号可以匹配括号内的任何字符,这就是为什么第一个 CASE 总是匹配的原因。

    解决方法是在语句中声明一个转义字符来转义括号。

    如果在WHERE 子句中使用,语法如下:

    WHERE t.ErrorText LIKE '%![IBM!]![CLI Driver!]![DB2/LINUXX8664!]%' ESCAPE '!'
    

    我不知道是否可能以及如何在CASE 语句中使用它...

    【讨论】:

    • 这看起来是个问题。我将问题的标题更改为更合适。
    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多