我正在测试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;如果是这样的解释,我会选择那个作为答案。
答案 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'))