2011-11-11 54 views
2

我想選擇包含@selctDescription參數的內容的記錄,但僅當@selctDescription不爲空時。使用TSQL中的CASE中的LIKE

我有以下的,不工作:

(t.[description] LIKE 
    (
    CASE 
    WHEN @selctDescription = '' THEN t.[description] 
    ELSE ('%' @selctDescription '%') 
    END 
) 
) 

任何人都可以點我在正確的方向?

回答

4
SELECT * 
FROM Table 
WHERE 
    ((@selctDescription IS NULL OR @selctDescription = '') 
    OR 
    (t.[description] LIKE '%' + @selctDescription +'%')) 
+0

感謝,但我沒有在我的應用程序中使用空值。 – CiccioMiami

+0

因此,刪除'@selctcription IS NULL',即使你今天沒有使用NULL,也很安全的考慮到這一點,我會說IsNullOrEmpty是這種情況的常見模式,所以我建議留下IS NULL條件以及 – sll

+1

@CiccioMiami:我們做了不知道;-)只是刪除該部分,然後 – zerkms

2
@selctDescription = '' OR t.[description] LIKE '%' + @selctDescription + '%' 
2

我覺得你的代碼就相當於:

t.[description] LIKE '%' + @selctDescription + '%' 

你從另一方面說明,表明你想這樣的:根據您的第一線和

@selctDescription <> '' 
AND t.[description] LIKE '%' + @selctDescription + '%' 
1

評論,你需要做出以下選擇:

Select * from table 
    where field <> '' 
    and field like '%' + @selctDescription + '%' 

但是你必須把正確的和@selctDesciption必須是文本(CHAR,NCHAR,VARCHAR,NVARCHAR,...)。

2

一對夫婦的想法你...

如果你有'%' @selctDescription '%',你只需要字符串之間+將它們串聯。您的代碼將按原樣運行。

  • '%' + @selctDescription + '%'


而且,它是有用的注意,你甚至都不需要CASE語句,當參數是空白的,你得到'%%',這將仍然匹配一切。


這是很有必要知道,因爲目前你對LIKE聲明兩側表字段。這真的會傷害優化器。如果我使用情況下,我會更傾向於堅持...

t.[description] LIKE (CASE WHEN @selctDescription = '' THEN '%' ELSE ('%' + @selctDescription + '%') END) 

這具有CASE語句的結果可以一次執行之前進行,作爲一個標量值,利益查詢。而不是重新計算有史以來。


而且這麼說,這便成爲功能上等同於...

t.[description] LIKE ('%' + @selctDescription + '%') 
+0

t [描述] LIKE(CASE WHEN'@selctDescription'=''THEN'%'ELSE('%'+'@selctDescription'+'%')END),當我有'='而不是像?時,可以使用這個表達式嗎? – CiccioMiami

+0

你不想在變量名稱周圍出現''''。但除此之外,是的,您也可以將此模式用於'='操作...'table.x =(CASE WHEN @variable =''THEN'Something Special'ELSE @variable END)' – MatBailie