子查询的WHERE子句在CASE语句(使用)
下面我有给我这个错误的查询:子查询的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
CASE
表达式只能返回单个标量值。分开两条腿和我们OR
:
AND ('5,137' = 'All'
OR a13.CLIENT_ID IN (Select val FROM DB01.dbo.f_split('5,137',',')))
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'
我不认为它很混乱,但对于某些人来说显然是这样。下次或许使用'@ x'之类的东西,那么很明显这是一个变量 – HoneyBadger
相比毫无意义您在这里有许多问题。看看你的案例表达的第一个条件。字符串文字'5,137'将永远不会等于字符串文字'全部',因此它没有机会到达任何其他分支。然后你有一个拆分函数,大概会返回多行。这绝不会像你编码那样工作。它会使用哪个值?你为什么要提供一个硬编码的字符串字面值并将其转换为varchar,然后隐式转换为a14.DATE的数据类型(我当然希望这是一个日期数据类型而不是varchar)。 –
他提到该字符串正在替换一个变量。我猜测在某些情况下,变量将等于'All' –
T-SQL中的CASE是一个**表达式**(如'a + b'),它只能返回**一个原子值** - 你不能使用它来有条件地执行整个代码块,也不能从它返回结果集 –