WHERE子句下的CASE语句中的子查询(使用IN)

时间:2016-01-06 15:11:59

标签: sql sql-server

我在下面的查询中给出了这个错误:

  

Msg 512,Level 16,State 1,Line 5
  子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我从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

2 个答案:

答案 0 :(得分:2)

CASE表达式只能返回单个标量值。将两条腿和我们分开OR

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

答案 1 :(得分: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'

进行比较毫无意义