2016-01-06 166 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