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

时间:2017-10-24 17:01:29

标签: sql-server tsql case where

我正在使用的查询的表示如下。

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语句中出现语法错误这一事实让我怀疑是否有可能返回多个值。

任何关于这个问题都可以解决的问题将不胜感激。

P.S。我已经通过创建一个临时表并在其上运行条件DELETE语句来解决这个问题,这实现了我尝试使用上述CASE语句的相同结果。然而,我很好奇,知道这个问题涉及的其他方法是否可行。

2 个答案:

答案 0 :(得分:2)

您可以简化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'))
)

同一个查询可以写成2个单独的查询,其中包含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')

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

CREATE INDEX IX_Table1_Col1_Col2_Incl ON Table1 (Col1, Col2) INCLUDE (Col3)

答案 1 :(得分:1)

Select col3
From tab
Where col1 = 'val1' and col2 in ('val3', 'val4') or
            col1 = 'val2' and col2 in ('val5', 'val6')