【问题标题】:TSQL error when CASE-WHEN returns subqueryCASE-WHEN 返回子查询时的 TSQL 错误
【发布时间】:2023-03-30 02:16:01
【问题描述】:

有没有办法在 IN() 语句中嵌套 CASE-WHEN 语句,以便 WHEN 或 ELSE 之一返回子查询。对我来说,这不应该是一个问题,但不知何故我得到了错误:

“子查询返回超过 1 个值。”

IN() 应该处理多个值!

这是一个重现错误的小例子:

-- tblA will be searched for values
Declare @tblA  table (i int)
insert @tblA
    select 1
    union select 2
    union select 3

--tblB: its values will be searched in tblA
Declare @tblB  table (i int)
insert @tblB
    select 2
    union select 3
    union select 1

--@c used by the CASE statement to match
declare @c varchar(50)
set @c = 'Match'

select *
from @tblA
where i IN ( -- IN statement should accept subquery in it
    case @c
        when 'Dont Match' then 2 --If it had matched, then the single value 2 would have been returned and TSQL would be happy
        else (
            select i from @tblB --TSQL not happy and causing error when more than one values returned from the subquery
        )
    end
)

【问题讨论】:

  • 为什么不使用IN (...) 而不是简单地使用标准的JOIN 子句?更高效,而且有效!
  • @MaxVernon,我同意,但这是一个非常简单的示例,说明我正在做的事情不允许 JOIN 语句。无论如何,谢谢。
  • 如果你想解决你的问题,你应该发布实际代码。

标签: sql-server tsql case-when in-subquery


【解决方案1】:

试试

select *
from @tblA A
WHERE (@c = 'Dont Match' AND i = 2) OR 
(@c <> 'Dont Match' AND EXISTS (SELECT * FROM @tblB WHERE i = A.i)

【讨论】:

  • 史蒂夫,感谢您的建议。我最终做了类似于你建议的事情,似乎是下一个最佳解决方案。代码并不干净,但它可以工作。如果 CASE-WHEN 语句有效,那就太好了。谢谢!
【解决方案2】:

您的问题不在于 IN 子句,而在于 CASE。
CASE 无法处理多个值。
有效

DECLARE @TBLA  TABLE (I INT)
INSERT INTO @TBLA
        ( [I] )
SELECT 0

SELECT [Result]=CASE WHEN 1=2 THEN 
    (SELECT I FROM @TBLA T) 
ELSE 
    (SELECT I FROM @TBLA T) 
END


无效,因为表变量包含两条记录。

DECLARE @TBLA  TABLE (I INT)
INSERT INTO @TBLA
        ( [I] )
SELECT 0
UNION 
SELECT 1


SELECT [Result]=CASE WHEN 1=2 THEN 
    (SELECT I FROM @TBLA T) 
ELSE 
    (SELECT I FROM @TBLA T) 
END

【讨论】:

  • 我同意。我希望他们在未来的版本中修复它,以便 CASE-WHEN 可以根据使用的上下文返回子查询。
【解决方案3】:
IN() is supposed to handle more than one values!

是的,确实如此。如果您以这种方式修改查询,您可以看到它

select *
from @tblA
where i IN ( select i from @tblB )

这个查询将被正确执行。 该错误是由CASE 语句产生的,因为它在THENELSE 子句中不能获得超过1 个值。

【讨论】:

  • Igor,在 IN() 子句中使用 case-when 是有原因的。否则,我不会这样做。不过还是谢谢。
  • @Aamir 我敢打赌,有几种解决方案可以解决您的问题。而你选择的那一款是最贵的。
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 2022-12-15
  • 2017-05-30
  • 2021-12-22
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多