2012-12-18 164 views
2

我正在處理SQL中的select語句,並遇到試圖創建包含case語句或if else語句的where子句的問題。我想根據變量的值選擇記錄。如果變量爲'True',那麼只返回列爲空的select語句中的記錄。如果變量不是「真」,則返回所有記錄,無論該列是否爲空。基於變量的動態where子句

有關如何做到這一點的任何提示?

下面是什麼,我試圖做一個簡單的例子:

declare @option1 as varchar(5) 

--This can be True or False so to test i just put the Set option below 
set @option1 = 'True' 

Select a,b,c,d... 
from ... 
where d = case when @option1 = 'True' then NULL End 

這是我不知道該怎麼做的部分。我只需要過濾掉記錄,如果變量是'真',所以不知道該怎麼把案件的其他部分。

回答

9

您不能測試d = NULL作爲您的CASE語句,因爲它將始終返回false,因爲NULL is not equal to NULL(除非您將ANSI_NULLS設置爲「off」)。

做將是WHERE子句改變這個最簡單的事情:

WHERE @option1 = 'False' OR d IS NULL 

如果你喜歡使用CASE語句,出於某種原因,你可以寫這樣的:

WHERE 1 = CASE WHEN @option1 = 'False' THEN 1 
       WHEN @option1 = 'True' AND d IS NULL THEN 1 
       ELSE 0 
      END 
1

這個:

更新:PinnyM已經弄清了這一點。我在這裏離開了我在羣衆教育方面令人尷尬的邏輯上有缺陷的論點。我在「嘗試這個」之後提出的解決方案當然依然有效,但PinnyM的解決方案更加優雅,應該使用。

WHERE @選項1 = '假' OR d IS NULL

總是返回所有的結果給了他目前的select語句(假設@選項1是簡單地傳遞一個標誌參數)。

試試這個:

SELECT a, b, c, d 
WHERE 
    -- Returns only rows where d is null (if @Option1 is True) 
    (@Option1 = 'True' AND d IS NULL) 
    OR 
    -- returns all the rows (if @Option1 is False) 
    (@Option1 = 'False') 
+0

在WHERE子句中我寫的,如果@選項1是「真」和d不爲空,則記錄將被排除在外。我非常肯定這正是OP所要求的...... – PinnyM

+0

如果我理解OP的問題(並且它是解釋性的!),則Option1不是表中的字段,因此,Option1的狀態對記錄的過濾。在您提出的WHERE子句中,無論Option1的值如何,都將包含d IS NOT NULL的所有行,並且其中始終包含d IS NULL的所有行。沒有過濾(除非我錯過了一些愚蠢的東西,這完全有可能)。 – XIVSolutions

+0

@PinnyM - 我相信你的第二個選擇可以做到這一點。 – XIVSolutions