【问题标题】:exclude a value in case statement in SQL Server 2008在 SQL Server 2008 中的 case 语句中排除值
【发布时间】:2016-12-16 10:00:21
【问题描述】:

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

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

如何从全部排除计划。

【问题讨论】:

  • 你能扩展一下吗?您能否提供示例数据和预期输出。
  • 我有一个名为 FollowUpStatus 的字段,其中包含 Scheduled、complete 和 In progress 的值。现在我想使用所有将显示完整和正在进行的结果(不包括计划记录)进行过滤。
  • 假设此代码在您的 WHERE 子句中,我会避​​免使用 CASE,我提供了一个替代方案作为单独的答案。

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


【解决方案1】:

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

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

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

这样做的好处是您没有在您的 WHERE 子句中进行计算,这应该有助于提高性能。

分解这个;

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

在这里,如果您将“全部”作为parameter 传递,那么您希望从FollowUpStatus 返回不是'Scheduled' 的所有内容。

OR @ScheduledStatus = FollowUpStatus

这表示如果您没有将'All' 作为parameter 传递,那么您一定选择了不同的值('Scheduled''Complete''In Progress')。仅返回 FollowUpStatus 等于该值的记录。

【讨论】:

  • 但是很丰富..我在表中没有“全部”值。所以它如何只过滤完成和进行中的记录?
  • 逻辑的第一部分是检查参数是否设置为'All',而不是表。如果参数 = 'All',则返回 FollowUpStatus 不是 'Scheduled' 的表中的所有内容。然后逻辑的第二部分说,如果参数不是“全部”(这意味着您选择了特定值),那么您只想返回参数中 FollowUpStatus = 您的值的行。
  • @AB4U 我已经扩展了我的答案以尝试进一步解释它,如果您仍有问题,请告诉我。
【解决方案2】:

实现结果的替代方法:

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

【讨论】:

    【解决方案3】:

    这是使用AND/OR 逻辑的一种方式

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

    【讨论】:

      猜你喜欢
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2017-07-27
      • 1970-01-01
      相关资源
      最近更新 更多