【问题标题】:How to Nest a CASE Statement in a WHERE Clause and Return Multiple Values如何在 WHERE 子句中嵌套 CASE 语句并返回多个值
【发布时间】:2018-04-05 14:00:24
【问题描述】:

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

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 语句实现的结果相同。不过我很好奇,想知道这个问题所涉及的其他方法是否可行。

【问题讨论】:

    标签: sql-server tsql case where


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      Select col3
      From tab
      Where col1 = 'val1' and col2 in ('val3', 'val4') or
                  col1 = 'val2' and col2 in ('val5', 'val6')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多