2016-01-06 204 views
0

下面我有給我這個錯誤的查詢:子查詢的WHERE子句在CASE語句(使用)

Msg 512, Level 16, State 1, Line 5
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

我得到的錯誤從子查詢WHERE子句。

當你看到'5,137'這將是一個變量取代它的地方。 而Select val FROM DB01.dbo.f_split('5,137',',')將返回分隔值列表作爲結果。

另一件事我想是把('5','137')代替(Select val FROM DB01.dbo.f_split('5,137',','))但我得到一個錯誤的逗號5和137

任何想法之間?所有的幫助非常感謝。

select 
    @Total_Orders = sum(a11.ORDER_CNT) 
from 
    a11 
join 
    a12 on (a11.STORE_ID = a12.STORE_ID) 
join 
    a13 on (a12.CLIENT_ID = a13.CLIENT_ID) 
join 
    a14 on (a11.ACTIV_DATE_ID = a14.DATE_ID) 
join 
    a15 on (a13.PARENT_ID = a15.PARENT_ID) 
where 
    a15.PARENT_DESC = 'Vanilla' 
    AND a13.CLIENT_ID IN 
    (
    CASE WHEN '5,137'<>'All' 
    THEN (Select val FROM DB01.dbo.f_split('5,137',',')) 
    ELSE (a13.CLIENT_ID) 
    END 
    ) 
    AND a14.DATE between CONVERT(char(10), '2015-12-27T00:00:00-05:00',126) and CONVERT(char(10), '2016-01-02T23:59:59-05:00',126) 
group by a13.PARENT_ID 
+0

相比毫無意義您在這裏有許多問題。看看你的案例表達的第一個條件。字符串文字'5,137'將永遠不會等於字符串文字'全部',因此它沒有機會到達任何其他分支。然後你有一個拆分函數,大概會返回多行。這絕不會像你編碼那樣工作。它會使用哪個值?你爲什麼要提供一個硬編碼的字符串字面值並將其轉換爲varchar,然後隱式轉換爲a14.DATE的數據類型(我當然希望這是一個日期數據類型而不是varchar)。 –

+1

他提到該字符串正在替換一個變量。我猜測在某些情況下,變量將等於'All' –

+1

T-SQL中的CASE是一個**表達式**(如'a + b'),它只能返回**一個原子值** - 你不能使用它來有條件地執行整個代碼塊,也不能從它返回結果集 –

回答

2

CASE表達式只能返回單個標量值。分開兩條腿和我們OR

AND ('5,137' = 'All' 
    OR a13.CLIENT_ID IN (Select val FROM DB01.dbo.f_split('5,137',','))) 
0

CASE並不像if在程序語言。 CASE只返回一個值。所以你必須給沿線的重寫WHERE條款:

WHERE ('5,137'<>'All' 
     AND a13.CLIENT_ID IN (Select val FROM DB01.dbo.f_split('5,137',','))) 
     OR '5,137'='All' 

我希望我理解正確的是'5,137'是一個佔位符,將使用不同的值來填充。否則,將其與'All'

+0

我不認爲它很混亂,但對於某些人來說顯然是這樣。下次或許使用'@ x'之類的東西,那麼很明顯這是一個變量 – HoneyBadger