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中。我已经编辑了我的答案,添加了一个案例陈述的例子,它具有相反的含义。我想我有每种情况,但你可能想做一个快速的精神检查。