如何在WHERE子句中嵌套CASE语句并返回多个值



我正在处理的查询的表示如下。

SELECT T1.Col3
FROM Table1 T1
WHERE T1.Col1 IN ('Value1','Value2')
AND (CASE
WHEN T1.Col1 = 'Value1'
THEN  T1.Col2 IN ('Value3','Value4','Value5')
WHEN T1.Col1 = 'Value2'
THEN  T1.Col2 IN ('Value6','Value7','Value8')
END
)

由于某种原因,我总是在第二秒左右出现语法错误。我在两个in语句的第一个逗号处也出现语法错误,但在第二个逗号处没有。这并不是说它应该有所作为,我还尝试将嵌套的IN语句更改为OR语句,如下所示:

THEN (T1.COL2 = 'Value3') OR (T1.COL2 = 'Value4') OR (T1.COL2 = 'Value5')

相反,我在第一个OR语句周围得到了一个语法错误。

我以前在WHERE子句中使用过CASE,但它只返回了一个值。事实上,我在第一个逗号或or语句处出现语法错误,这让我怀疑返回多个值是不可能的。

如果你能对这个问题有所了解,我们将不胜感激。

附言:我已经有了一个变通办法,创建了一个临时表,并在上面运行条件DELETE语句,这与我试图用上面的CASE语句实现的结果相同。然而,我很好奇,想知道这个问题所涉及的另一种方法是否可行。

您可以简化WHERE标准,如下所示:

SELECT T1.Col3
FROM Table1 T1
WHERE 
(
(T1.Col1 = 'Value1' AND T1.Col2 IN ('Value3','Value4','Value5'))
OR
(T1.Col1 = 'Value2' AND T1.Col2 IN ('Value6','Value7','Value8'))
)

相同的查询可以用UNION:写成两个单独的查询

SELECT T1.Col3
FROM Table1 T1
WHERE T1.Col1 = 'Value1'
AND T1.Col2 IN ('Value3','Value4','Value5')
UNION -- note that this will return distinct results
SELECT T1.Col3
FROM Table1 T1
WHERE T1.Col1 = 'Value2'
AND T1.Col2 IN ('Value6','Value7','Value8')

但是,请注意,带有OR子句的WHERE可能会导致昂贵的查询计划。如果查询非常昂贵,则此查询的覆盖索引可能会有所帮助:

CREATE INDEX IX_Table1_Col1_Col2_Incl ON Table1 (Col1, Col2) INCLUDE (Col3)
Select col3
From tab
Where col1 = 'val1' and col2 in ('val3', 'val4') or
col1 = 'val2' and col2 in ('val5', 'val6')

最新更新