在SQL Server 2008中排除case语句中的值

时间:2016-12-16 10:00:21

标签: sql sql-server sql-server-2008 stored-procedures

我有一个值下拉列表:AllScheduledCompleteIn Progress。现在我想使用All进行过滤,但希望在其中排除schedule。我使用以下CASE表达式:

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

如何从全部排除预定。

3 个答案:

答案 0 :(得分:1)

我不会使用CASE表达式。试试这样的事情;

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

逻辑是,如果您将'All'作为parameter传递,那么它将返回不是FollowUpStatus的所有'Scheduled',否则它会返回WHERE将返回通过的值。

这样做的好处是,您不会在WHERE (@ScheduledStatus = 'All' AND FollowUpStatus <> 'Scheduled') 条款中计算出有助于提升效果的条款。

要打破这一点;

parameter

在这里,如果你通过了所有&#39;作为FollowUpStatus,您希望返回'Scheduled'的所有内容,而不是OR @ScheduledStatus = FollowUpStatus

'All'

然后,如果您未将parameter作为'Scheduled'传递,那么您必须选择不同的值('Complete''In Progress'或{{ 1}})。仅返回FollowUpStatus等于此值的记录。

答案 1 :(得分:0)

实现结果的替代方式:

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

答案 2 :(得分:0)

以下是使用AND/OR逻辑

的一种方法
WHERE  ( tClientInteractions.FollowUpStatus IN ( 'Complete', 'In Progress' )
         AND @ScheduledStatus = 'All' )
        OR ( tClientInteractions.FollowUpStatus = @ScheduledStatus )