2016-12-16 92 views
1

我有一個下拉值爲:All,Scheduled,CompleteIn Progress。現在我想用All進行過濾,但是想要排除其中的schedule。我使用以下CASE表達爲:在SQL Server 2008中排除case語句中的值

tClientInteractions.FollowUpStatus =  
case @ScheduledStatus 
when 'All' then ('Complete','In Progress') 
else @ScheduledStatus 
end 

如何排除所有調度。

+1

你能在這個擴張?你能提供樣本數據和預期產出嗎? –

+0

我有一個名爲FollowUpStatus的字段,它保存計劃,完成和進行中的值。現在我想過濾使用所有將顯示完成和進行結果排除計劃記錄。 – AB4U

+0

假設這段代碼在你的WHERE子句中,我會避​​免使用CASE,我已經提供了一個替代方案作爲單獨的答案。 –

回答

1

我不會用一個CASE表達。嘗試這樣的事情;

WHERE (@ScheduledStatus = 'All' AND FollowUpStatus <> 'Scheduled') 
OR @ScheduledStatus = FollowUpStatus 

的邏輯是,如果你傳遞'All'作爲parameter那麼它將返回所有FollowUpStatus不在'Scheduled',否則它會返回這些透過傳遞的值。

這樣做的好處是,你不計算你的WHERE條款,這應該有助於表現。

爲了打破這一點;

WHERE (@ScheduledStatus = 'All' AND FollowUpStatus <> 'Scheduled') 

在這裏,如果你通過「所有」作爲parameter,那麼你想從FollowUpStatus返回的一切,是不是'Scheduled'

OR @ScheduledStatus = FollowUpStatus 

這則說,如果你沒有通過'All'作爲parameter,那麼你必須選擇了一個不同的值('Scheduled''Complete''In Progress')。只返回FollowUpStatus等於此值的記錄。

+0

但豐富..我沒有'全部'值table.so它將如何過濾只完成和正在進行的記錄? – AB4U

+0

邏輯的第一部分是檢查參數是否設置爲「全部」,而不是表格。如果參數='All',則返回FollowUpStatus不是'Scheduled'的表中的所有內容。然後邏輯的第二部分說如果參數不是'All'(這意味着你選擇了一個特定的值),那麼你只想返回FollowUpStatus =你的參數值。 –

+0

@ AB4U我已經擴展了我的答案,試圖進一步解釋它,讓我知道你是否還有問題。 –

0

替代方式來實現你的結果:

IF @ScheduledStatus = 'All' 
BEGIN 
    tClientInteractions.FollowUpStatus = Your_Statement 
    WHERE Your_Condition 
END 
ELSE 
    tClientInteractions.FollowUpStatus = @ScheduledStatus 
    WHERE Your_Condition 
0

這裏有一種方法使用AND/OR邏輯

WHERE (tClientInteractions.FollowUpStatus IN ('Complete', 'In Progress') 
     AND @ScheduledStatus = 'All') 
     OR (tClientInteractions.FollowUpStatus = @ScheduledStatus)