SQL 服务器 LIKE 搜索 [ ] 与预期不匹配
SQL Server LIKE search with [ ] not matching as expected
我正在尝试搜索 SQL 服务器数据库中 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 运算符。但是当我 运行 这个查询时,无论我输入什么文本或模式,它总是匹配第一种情况。
我做错了什么?
这是 character escaping 的问题。
方括号必须正确处理,否则会被解释为特殊字符,例如 %
;使用方括号匹配括号内的任何字符,这就是第一个 CASE
总是匹配的原因。
解决方法是在语句中声明一个转义字符来转义括号。
如果在 WHERE
子句中使用,语法如下:
WHERE t.ErrorText LIKE '%![IBM!]![CLI Driver!]![DB2/LINUXX8664!]%' ESCAPE '!'
我不知道是否可行以及如何在 CASE
语句中使用它...
我正在尝试搜索 SQL 服务器数据库中 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 运算符。但是当我 运行 这个查询时,无论我输入什么文本或模式,它总是匹配第一种情况。
我做错了什么?
这是 character escaping 的问题。
方括号必须正确处理,否则会被解释为特殊字符,例如 %
;使用方括号匹配括号内的任何字符,这就是第一个 CASE
总是匹配的原因。
解决方法是在语句中声明一个转义字符来转义括号。
如果在 WHERE
子句中使用,语法如下:
WHERE t.ErrorText LIKE '%![IBM!]![CLI Driver!]![DB2/LINUXX8664!]%' ESCAPE '!'
我不知道是否可行以及如何在 CASE
语句中使用它...