2015-07-21 29 views
1

我試圖搜索一個SQL Server數據庫中的text列的內容。我沒有爲全文索引添加到列的能力,所以我想在查詢中這樣做:SQL Server LIKE搜索與[]不符合預期

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運算符。但是當我運行這個查詢時,無論我輸入什麼文本或模式,它總是匹配第一個案例。

我在做什麼錯?

回答

1

這是character escaping的問題。

方括號必須正確處理,因爲否則被解釋爲特殊字符如%是;使用方括號可以匹配括號內的任何字符,這就是爲什麼第一個CASE總是匹配的原因。

解決的辦法是在聲明中聲明一個轉義字符來轉義括號。

如果在WHERE子句中使用的語法將如下所示:

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

我不知道是否是可能的,如何在CASE語句中使用它...

+0

這看起來像問題。我將問題的標題改爲更合適。 – Paul