Sql 带ELSE的WHERE子句中的多个案例

Sql 带ELSE的WHERE子句中的多个案例,sql,sql-server,tsql,case,Sql,Sql Server,Tsql,Case,我试图在WHERE子句中编写一个CASE语句,类似这样。 我的问题是,在这篇文章的结尾,我想说的是(@Q1、@Q2、@Q3、@Q4)。因此,如果这些条件都不满足,那么就采取其他措施。我不知道如何添加此ELSE语句 AND CalendarQuarter in ( /*March, June, Sep 2010 Metcard*/ (CASE WHEN DATEPART(yy,@year_end) = 2010 AND @ticketing_system = 'm

我试图在
WHERE
子句中编写一个
CASE
语句,类似这样。 我的问题是,在这篇文章的结尾,我想说的是(@Q1、@Q2、@Q3、@Q4)。因此,如果这些条件都不满足,那么就采取其他措施。我不知道如何添加此
ELSE
语句

AND CalendarQuarter in
(
    /*March, June, Sep 2010 Metcard*/
    (CASE WHEN DATEPART(yy,@year_end) = 2010 
        AND @ticketing_system = 'metcard' 
        AND DATEPART(mm,@year_end) IN (3,6,9)  THEN @Q1  END),
    (CASE WHEN DATEPART(yy,@year_end) = 2010
        AND @ticketing_system = 'metcard' 
        AND DATEPART(mm,@year_end) IN (3,6)  THEN @Q2  END),
    (CASE WHEN DATEPART(yy,@year_end) = 2010
        AND @ticketing_system = 'metcard' 
        AND DATEPART(mm,@year_end) IN (3)  THEN @Q3  END),

    /*March, June, Sep 2010 Metcard/Myki*/  
    (CASE WHEN DATEPART(yy,@year_end) = 2010 
        AND @ticketing_system = 'metcard/myki' 
        AND DATEPART(mm,@year_end) IN (9,6,3)  THEN @Q4  END),
    (CASE WHEN DATEPART(yy,@year_end) = 2010 
        AND @ticketing_system = 'metcard/myki' 
        AND DATEPART(mm,@year_end) IN (9,6)  THEN @Q3  END),
    (CASE WHEN DATEPART(yy,@year_end) = 2010 
        AND @ticketing_system = 'metcard/myki' 
        AND DATEPART(mm,@year_end) IN (9)  THEN @Q2  END),

    /*March, June, Sep 2013 Metcard/Myki*/
    (CASE WHEN DATEPART(yy,@year_end) = 2013 
        AND @ticketing_system = 'metcard/myki' 
        AND DATEPART(mm,@year_end) IN (3,6,9)  THEN @Q1  END),
    (CASE WHEN DATEPART(yy,@year_end) = 2013
        AND @ticketing_system = 'metcard/myki' 
        AND DATEPART(mm,@year_end) IN (3,6)  THEN @Q2  END),
    (CASE WHEN DATEPART(yy,@year_end) = 2013
        AND @ticketing_system = 'metcard/myki' 
        AND DATEPART(mm,@year_end) IN (3)  THEN @Q3  END),

    /*March, June, Sep 2013 Myki*/  
    (CASE WHEN DATEPART(yy,@year_end) = 2013 
        AND @ticketing_system = 'myki' 
        AND DATEPART(mm,@year_end) IN (9,6,3)  THEN @Q4  END),
    (CASE WHEN DATEPART(yy,@year_end) = 2013 
        AND @ticketing_system = 'myki' 
        AND DATEPART(mm,@year_end) IN (9,6)  THEN @Q3  END),
    (CASE WHEN DATEPART(yy,@year_end) = 2013 
        AND @ticketing_system = 'myki' 
        AND DATEPART(mm,@year_end) IN (9)  THEN @Q2  END),

    /*ELSE....IN (@Q1,@Q2,@Q3,@Q4)*/

)

我没有足够的声誉给你的帖子添加评论,但听起来你想添加另一个案例陈述。ELSE不应该有任何条件,它用于捕获它所附加到的case语句中与任何条件都不匹配的所有内容

e、 g。 foo列可以包含1、2、3或4,我们希望将该列分别设置为a、b、c或c。我们有以下案例陈述

CASE
    WHEN foo = 1
        THEN 'a'
    WHEN foo = 2
        THEN 'b'
    ELSE 'c'
END
我们不需要为3或4添加案例,因为它们与1或2不匹配,所以它们将由else处理,将它们设置为c

如果您试图向else语句添加另一个条件,则可以在else语句中使用另一个case语句。在本例中,我们希望将foo3或foo4的值转换为x或y

CASE
    WHEN foo = 1
        THEN 'a'
    WHEN foo = 2
        THEN 'b'
    ELSE CASE
            WHEN foo = 3
                THEN 'x'
            WHEN foo = 4
                THEN 'y'
            ELSE NULL
        END
END
当然,您可以使用任何想要的值,您不需要在条件中计算单个列

编辑:我使用您的案例陈述创建了一个示例。它在ELSE中有第二个case语句,允许您向ELSE添加条件

AND CalendarQuarter IN
                    (
                    CASE 
                        /*March, June, Sep 2010 Metcard*/
                        WHEN DATEPART(yy,@year_end) = 2010 
                                        AND @ticketing_system = 'metcard' 
                                        AND DATEPART(mm,@year_end) IN (3,6,9)  
                            THEN @Q1
                        WHEN DATEPART(yy,@year_end) = 2010
                                        AND @ticketing_system = 'metcard' 
                                        AND DATEPART(mm,@year_end) IN (3,6)  
                            THEN @Q2
                        WHEN DATEPART(yy,@year_end) = 2010
                                        AND @ticketing_system = 'metcard' 
                                        AND DATEPART(mm,@year_end) IN (3)  
                            THEN @Q3

                        /*March, June, Sep 2013 Metcard/Myki*/
                        CASE WHEN DATEPART(yy,@year_end) = 2010 
                                        AND @ticketing_system = 'metcard/myki' 
                                        AND DATEPART(mm,@year_end) IN (9,6,3)  
                            THEN @Q4
                        WHEN DATEPART(yy,@year_end) = 2010 
                                        AND @ticketing_system = 'metcard/myki' 
                                        AND DATEPART(mm,@year_end) IN (9,6)  
                            THEN @Q3
                        WHEN DATEPART(yy,@year_end) = 2010 
                                        AND @ticketing_system = 'metcard/myki' 
                                        AND DATEPART(mm,@year_end) IN (9)  
                            THEN @Q2

                        /*March, June, Sep 2013 Metcard/Myki*/
                        WHEN DATEPART(yy,@year_end) = 2013 
                                        AND @ticketing_system = 'metcard/myki' 
                                        AND DATEPART(mm,@year_end) IN (3,6,9)  
                            THEN @Q1
                        WHEN DATEPART(yy,@year_end) = 2013
                                        AND @ticketing_system = 'metcard/myki' 
                                        AND DATEPART(mm,@year_end) IN (3,6)  
                            THEN @Q2
                        WHEN DATEPART(yy,@year_end) = 2013
                                        AND @ticketing_system = 'metcard/myki' 
                                        AND DATEPART(mm,@year_end) IN (3)  
                            THEN @Q3

                        /*March, June, Sep 2013 Myki*/ 
                        WHEN DATEPART(yy,@year_end) = 2013 
                                        AND @ticketing_system = 'myki' 
                                        AND DATEPART(mm,@year_end) IN (9,6,3)  
                            THEN @Q4
                        WHEN DATEPART(yy,@year_end) = 2013 
                                        AND @ticketing_system = 'myki' 
                                        AND DATEPART(mm,@year_end) IN (9,6)  
                            THEN @Q3
                        WHEN DATEPART(yy,@year_end) = 2013 
                                        AND @ticketing_system = 'myki' 
                                        AND DATEPART(mm,@year_end) IN (9)  
                            THEN @Q2

                        ELSE CASE
                                WHEN [YOUR CONDITION HERE] IN (@Q1,@Q2,@Q3,@Q4)
                                    THEN [SOME RESULT]
                                END
                    END
                    )
只要满足条件,就会返回上述语句。另一种方法是使用原始的case语句,但不是使用else,而是使用与上述条件相反的条件。e、 g

CASE 
    WHEN DATEPART(yy,@year_end) = 2013
        THEN CASE 
                WHEN @ticketing_system = 'myki' 
                    THEN CASE
                            WHEN DATEPART(mm,@year_end) NOT IN (9,6,3)
                                THEN (@Q1,@Q2,@Q3,@Q4)
                        END
                WHEN @ticketing_system = 'metcard/myki' 
                    THEN CASE
                            WHEN DATEPART(mm,@year_end) NOT IN (3,6,9)
                                THEN (@Q1,@Q2,@Q3,@Q4)
                        END
             END
    WHEN DATEPART(yy,@year_end) = 2010
        THEN CASE
                WHEN @ticketing_system = 'metcard/myki'
                    THEN CASE
                            WHEN DATEPART(mm,@year_end) NOT IN (9,6,3)
                                THEN (@Q1,@Q2,@Q3,@Q4)
                        END
                WHEN @ticketing_system = 'metcard' 
                    THEN CASE
                            WHEN DATEPART(mm,@year_end) NOT IN (3,6,9)
                                THEN (@Q1,@Q2,@Q3,@Q4)
                         END
            END
END

我建议您避免使用case子句,并尝试使用:

WHERE (DATEPART(yy,@year_end) = 2010
AND @ticketing_system         = 'metcard'
AND DATEPART(mm,@year_end)   IN (3,6,9)
AND CalendarQuarter          IN (@Q1))
OR 
(DATEPART(yy,@year_end)    = 2010
AND @ticketing_system         = 'metcard'
AND DATEPART(mm,@year_end)   IN (3,6)
AND CalendarQuarter          IN (@Q2))
..................................
OR 
(DATEPART(yy,@year_end)    = 2013
AND @ticketing_system         = 'myki'
AND DATEPART(mm,@year_end)   IN (9)
AND CalendarQuarter          IN(@Q2) )
OR 
(CalendarQuarter          IN (@Q1,@Q2,@Q3,@Q4))

有了这段代码,当它发现其中一条语句为真时,它不会停止吗?例如,如果第一条语句为真,那么我仍然希望它对第二条语句求值,因为它可能也是真的。你是对的,这只会在一条记录上匹配。我所能建议的最简单的解决方案是写一个最终的案例陈述,它与继续它的案例陈述相反。或者,您可以将case语句的结果用作查询中的一列,然后将其包装在selecttestingfornull中。我已经编辑了我的答案,添加了一个案例陈述的例子,它具有相反的含义。我想我有每种情况,但你可能想做一个快速的精神检查。