【问题标题】:Case Statement in SQL QuerySQL 查询中的 case 语句
【发布时间】:2013-02-07 20:15:15
【问题描述】:

我试图在 SQL Server 2005 中像这样在 select 语句中使用 case 语句,但我收到错误消息“当 EXISTS 未引入子查询时,只能在选择列表中指定一个表达式。”不能在 SQL 查询中使用 Case 吗?!

declare @TypeofDayID int
set @TypeofDayID = (Select TypeofDayID from RepInfo where RepInfoID = @RepInfoID)


Select CASE 
    WHEN @TypeofDayID = 1 
        THEN (Select * from RepInfo RD inner join SellingInfo S on S.RepInfoID = @RepInfoID)
    WHEN @TypeofDayID = 2
        THEN (Select * from RepInfo RD inner join UpgradingInfo U on U.RepInfoID = @RepDailyID)
    WHEN @TypeofDayID = 9 or @TypeofDayID = 10
        THEN (Select * from RepInfo RD inner join DeliveryInfo D on D.RepDailyID = @RepDailyID)
    END
from RepInfo RD

【问题讨论】:

  • 当您在SELECT 上使用CASE 语句来定义单个列时,您不能执行SELECT CASE WHEN something THEN SELECT *...
  • 没有。子查询不能。使用if 块。
  • 同意上述。您可以在 SELECT 期间使用 CASE 测试值,但如果您希望执行不同类型的代码,则需要使用 IF。
  • 您可能会遇到此查询或当前答案的性能问题,因为可能会针对 3 个条件之一进行优化,而另外两个可能会更慢,或者查询计划将经常重建。 stackoverflow.com/q/289625/16391

标签: sql sql-server-2005


【解决方案1】:

CASE 不用于逻辑流控制...改用IF / ELSE IF:

declare @TypeofDayID int
set @TypeofDayID = (Select TypeofDayID from RepInfo where RepInfoID = @RepInfoID)

IF @TypeofDayID = 1 
  Select * 
  from RepInfo RD inner join SellingInfo S on S.RepInfoID = @RepInfoID
ELSE IF @TypeofDayID = 2
  Select * 
  from RepInfo RD inner join UpgradingInfo U on U.RepInfoID = @RepDailyID
ELSE IF @TypeofDayID = 9 or @TypeofDayID = 10
  Select * 
  from RepInfo RD inner join DeliveryInfo D on D.RepDailyID = @RepDailyID

请记住...由于您使用的是SELECT *,并基于@TypeOfDayID 加入了不同的表,因此您最终可能会得到一个参差不齐的结果集,这意味着您将有一个不同的基于采用哪个分支的列数。

以编程方式处理这可能会很痛苦,因此出于这个原因以及其他原因,最好避免使用SELECT *...

【讨论】:

  • 不仅是 SELECT *,而且这些条件也有可能导致性能不佳。
【解决方案2】:

我认为这样可以更好地处理您正在尝试做的事情。

declare @TypeofDayID int
set @TypeofDayID = (Select TypeofDayID from RepInfo where RepInfoID = @RepInfoID)

IF @TypeofDayID = 1 
    Select * 
    from RepInfo RD 
    inner join SellingInfo S on S.RepInfoID = @RepInfoID
ELSE IF @TypeofDayID = 2
    Select * 
    from RepInfo RD 
    inner join UpgradingInfo U on U.RepInfoID = @RepDailyID
ELSE IF @TypeofDayID = 9 or @TypeofDayID = 10
    Select * 
    from RepInfo RD 
    inner join DeliveryInfo D on D.RepDailyID = @RepDailyID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2022-06-21
    • 2023-02-21
    • 2017-04-21
    • 2011-11-01
    相关资源
    最近更新 更多