我正在处理的查询的表示如下。
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')