2013-05-06 261 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))