3

サブクエリなしで正常に機能するwhere句内にケース条件を記述しましたが、サブクエリでは機能しません

例えば

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 バグです。

4

3 に答える 3

2

あなたが受け取っているエラーは、「サブクエリが複数の値を返しました」だと思います。したがって、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)
于 2013-05-06T15:21:58.377 に答える
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'
   )

EDITED複数の基準を使用する方法を示す

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')
   )
于 2013-05-06T15:14:24.063 に答える