我正在使用的查询的表示如下。
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语句的相同结果。然而,我很好奇,知道这个问题涉及的其他方法是否可行。
答案 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')