【问题标题】:select inside case statement in where clause tsql在where子句sql中选择内部case语句
【发布时间】:2013-05-06 23:48:59
【问题描述】:

我在 where 子句中写了一个 case 条件,它在没有任何子查询的情况下工作正常,但它不适用于子查询

例如

declare @isadmin varchar(5) = 'M'

select * from Aging_calc_all a where a.AccountNumber in 
(case @isadmin when 'M' then 1 else 0 end)

工作正常。

但是这似乎不起作用 -

select * from Aging_calc_all a where a.AccountNumber in 
(case @isadmin when 'M' then (select AccountNumber from ACE_AccsLevelMaster where AssignedUser=7) else 0 end)

任何建议或这是 2008 年的 t-sql 错误。

【问题讨论】:

  • 这可能会返回多个值select AccountNumber from ACE_AccsLevelMaster where AssignedUser=7,试试select COUNT(AccountNumber) from ACE_AccsLevelMaster where AssignedUser=7

标签: sql sql-server tsql


【解决方案1】:

您收到的错误是“子查询返回超过 1 个值”,我相信。所以你不能在 THEN 之后返回多个值。 你应该把你的查询改写成这样:

select 
    * 
from Aging_calc_all a 
where 
    (@isadmin='M' and a.AccountNumber in (select AccountNumber from ACE_AccsLevelMaster where AssignedUser=7))
    or 
    (@isadmin<>'M' and a.AccountNumber=0)

【讨论】:

  • 还有一件事:考虑到@isadmin 为空时不会返回任何行。
  • 我想过这个问题,但我试图用 CASE 解决这个问题 :) 我现在用过这个,但你能告诉我为什么用 CASE 不可能吗?谢谢,1 分。
  • @QMaster 因为CASE 的工作方式如下:“评估条件列表并返回多个可能的结果表达式之一。”。它允许您将比较运算符与CASE 一起使用,但也意味着CASE 不能返回多个值。
  • @AdamŁuniewski 我尝试返回不同的列表(使用特殊函数将字符串列表拆分为块并作为记录返回的表)作为每个 CASE 结果,但失败了。我认为正如你所说,CASE 不能这样做,因为它是自然的,不是吗?
【解决方案2】:
select * from Aging_calc_all a where a.AccountNumber in (
   SELECT AccountNumber 
     from ACE_AccsLevelMaster 
     where AssignedUser=7 AND @isadmin = 'M'
   UNION ALL select 0 where @isadmin <> 'M'
   )

已编辑展示如何使用多个条件

select * from Aging_calc_all a where a.AccountNumber in (
   SELECT AccountNumber 
     from ACE_AccsLevelMaster 
     where AssignedUser=7 AND @isadmin = 'M'
   -- case to select from another table:
   UNION ALL select * from ANOTHER_TABLE where @isadmin = 'A' 
   -- case to select from const set (1, 2, 3):
   UNION ALL select * from ( 
      select 1 union all select 2 union all select 3) x where @isadmin = 'B' 
   -- case to show how 'else' work
   UNION ALL select 0 where @isadmin not in( 'M', 'A', 'B')
   )

【讨论】:

  • 这似乎有效,但这不是使用可以有多个条件的 case 语句。
  • @PradyutBhattacharya 您可以使用与 CASE 一样多的 UNION ALL 标准,详情请参阅我的编辑
【解决方案3】:

这应该可行(尽管它不是问题的直接答案):

SELECT * 
FROM   aging_calc_all a 
WHERE  ( @isadmin <> 'M' AND a.accountnumber = 0 ) 
    OR ( @isadmin =  'M' AND a.accountnumber IN (SELECT accountnumber 
                                     FROM   ace_accslevelmaster 
                                     WHERE  assigneduser = 7) ) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2015-07-25
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多