2010-08-10 90 views
2

我有一個過程,其中以下條件將被寫入WHERE子句中。我怎麼做。有條件檢查Where子句

itemid是一個可以爲null的參數。

如果itemid的可用然後將其添加到我的where子句,否則什麼也不做

+0

,如果你想人來幫助你先幫助他們理解你的問題。 「它不工作」是什麼意思?什麼是完整查詢? – Andrey 2010-08-10 10:32:07

+0

如果ItemID爲NULL,那麼它不應該獲取任何行?還是應該在Row_Start和Row_End之間獲取rownum? – 2010-08-10 10:34:02

回答

3

有些人用這種技術

... WHERE @itemid IS NULL OR tbl.itemid = @itemid 

它保證,雖然你永遠不會得到一個指數ITEMID列求。

如果表是在所有大更好的辦法是到了分裂查詢分成2個獨立的情況下

IF(@itemid IS NULL) 
    SELECT foo FROM bar 
ELSE 
    SELECT foo FROM bar WHERE itemid = @itemid 

如果組合的數量太大,可以考慮動態SQL。確保你首先理解SQL注入。

價:Dynamic Search Conditions in T-SQL

+0

如果我們有'@itemid IS NULL OR tbl.itemid = @ itemid',你確定沒有使用索引itemid嗎?根據巡迴測試,其使用指數。也許你的回答太舊了? – user960567 2017-03-21 13:51:14

2

例如

SELECT Something 
FROM SomeTable 
WHERE (@MyParam IS NULL OR SomeField = @MyParam) 
    AND AnotherField = 1 

您需要在特定場景中測試性能。如果它是一個簡單的查詢,即沒有很多的條件參數,你可能會想,而不是嘗試一下本作的表現:

IF (@MyParam IS NULL) 
    SELECT Something 
    FROM SomeTable 
    WHERE AnotherField = 1 
ELSE 
    SELECT Something 
    FROM SomeTable 
    WHERE SomeField = @MyParam 
     AND AnotherField = 1