【问题标题】:Subquery in CASE statement under the WHERE clause (using IN)WHERE 子句下 CASE 语句中的子查询(使用 IN)
【发布时间】:2016-01-06 15:11:58
【问题描述】:

我有下面的查询给我这个错误:

消息 512,第 16 级,状态 1,第 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

【问题讨论】:

  • 这里有很多问题。查看 case 表达式的第一个条件。字符串文字 '5,137' 永远不会等于字符串文字 'All' 所以它不可能到达任何其他分支。然后你有一个拆分函数,它可能会返回多行。这永远不会像你编码的那样工作。它会使用哪个值?为什么要提供硬编码字符串文字并转换为 varchar,然后将其隐式转换为 a14.DATE 的数据类型(我当然希望这是日期数据类型而不是 varchar)。
  • 他提到字符串正在替换一个变量。我猜在某些情况下变量将等于“全部”
  • CASE 在 T-SQL 中是一个 表达式(如 a+b),它只能返回 一个原子值 - 你不能使用它有条件地执行整个代码块,也不能从中返回结果集

标签: sql sql-server


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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之类的东西,那么很明显它是一个变量
    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2021-03-14
    相关资源
    最近更新 更多