IN中的CASE,多个值不起作用

时间:2014-11-03 03:55:31

标签: sql-server sql-server-2008-r2

我正在测试CASE声明。我希望将值放在' IN'根据代码值更改

这有效

WITH test(Part, Code) AS (
    SELECT '001', 'A' UNION SELECT '002', 'A' UNION
    SELECT '003', 'A' UNION SELECT '004', 'B' UNION
    SELECT '005', 'B' UNION SELECT '006', 'B')
SELECT * FROM test WHERE Part IN (CASE Code
    WHEN 'A' THEN '001'
    WHEN 'B' THEN '004'
    END)

' IN'可以替换为' ='这里仅用于与以下代码进行比较

这不起作用

WITH test(Part, Code) AS (
    SELECT '001', 'A' UNION SELECT '002', 'A' UNION
    SELECT '003', 'A' UNION SELECT '004', 'B' UNION
    SELECT '005', 'B' UNION SELECT '006', 'B')
SELECT * FROM test WHERE Part IN (CASE Code
    WHEN 'A' THEN '001', '002'
    WHEN 'B' THEN '004', '005'
    END)

SSMS抱怨''。你如何修复上面的代码?

我会选择最小变化的那个作为答案。

被修改

有人要求提供我想要实现的等效代码:

SELECT * FROM test WHERE
    (Code = 'A' AND Part IN ('001', '002'))
    OR
    (Code = 'B' AND Part IN ('004', '005'))
    OR
    (Code = 'C' AND Part IN ('007', '008'))
    OR
    (Code = 'D' AND Part IN ('010', '011'))

显然,我希望通过将它们组合成CASE语句来避免重复使用相同的模式:

SELECT * FROM test WHERE Part IN (<case statement>)

我知道还有其他方法可以找到结果,但是这个问题是关于使用带有多个值的CASE和IN来使查询更好和干净,而不是如何查找结果。随意回答&#34;不可能&#34;如果是这样的解释,我会选择那个作为答案。

2 个答案:

答案 0 :(得分:2)

不,这是不可能的。正如我在评论中所说,CASE会返回单个标量值。

我自己关于如何修复它的建议是将搜索条件放在另一个表中,然后只使用带有子查询的EXISTS

WITH test(Part, Code) AS (
    SELECT '001', 'A' UNION SELECT '002', 'A' UNION
    SELECT '003', 'A' UNION SELECT '004', 'B' UNION
    SELECT '005', 'B' UNION SELECT '006', 'B')
, conditions (Code,Part) as (
    SELECT 'A','001' UNION ALL
    SELECT 'A','002' UNION ALL
    SELECT 'B','004' UNION ALL
    SELECT 'B','005')
SELECT * FROM test t WHERE EXISTS
     (SELECT * FROM conditions c where
           t.Part = c.Part and
           t.Code = c.Code)

希望能够满足你避免重复的愿望。


这也是为什么我通常会鼓励人们给我们解决整体问题,而不是解决(未知问题)的问题 - CASE绝对是这项工作的错误工具,所以 设法使用CASE的任何解决方案都会变得丑陋。

答案 1 :(得分:1)

我怀疑CASE可以帮助你

尝试使用条件子句:

WITH test(Part, Code) AS (
  SELECT '001', 'A' UNION SELECT '002', 'A' UNION
  SELECT '003', 'A' UNION SELECT '004', 'B' UNION
  SELECT '005', 'B' UNION SELECT '006', 'B')

SELECT * FROM test WHERE
  (Code <> 'A' OR Part IN ('001', '002'))
  AND
  (Code <> 'B' OR Part IN ('004', '005'))