2013-05-06 311 views
3

我已经写了这是没有任何子查询工作的罚款where子句中的情况下,条件内case语句,但它不与子工作查询选择在where子句TSQL

例如

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年

+0

这可能返回多个值从ACE_AccsLevelMaster ACE_AccsLevelMaster其中AssignedUser = 7',尝试'SELECT COUNT(账户号码)'选择账户号码,其中AssignedUser = 7' – 2013-05-06 15:14:00

回答

2

您收到的错误是“子查询返回超过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) 
+0

是的,你是对的。这似乎更像是一个案例声明。不错的一个... – 2013-05-06 15:29:54

+0

还有一件事:考虑没有行将被返回@isadmin为空。 – 2013-05-07 07:52:44

+0

我想过这个,但是我试图用CASE来解决这个问题:)现在我用了这个,但是请你告诉我为什么CASE不可能这么做?谢谢,1分。 – QMaster 2014-12-10 10:09:34

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一个T-SQL的错误要展示如何使用多个条件

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') 
    ) 
+0

这似乎要工作,但这不是使用可能有多个条件的案例陈述。 – 2013-05-06 15:20:27

+0

@PradyutBhattacharya您可以使用尽可能多的'UNION ALL'条件作为CASE查看我的编辑细节 – Dewfy 2013-05-06 15:45:08

+0

不错的@dewfy。在编辑方面努力不懈。 – 2013-05-06 17:22:14

1

这应该工作(虽然它不是一个直接的答案的问题):

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))