2016-12-16 154 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)