是否有任何功能可以减少使用“ CASE”时查询的大小

时间:2019-05-06 11:03:41

标签: sql sql-server

我必须在一个报表中获取并显示每月数据,当前我正在使用CASE函数来获取基于月份的值。还有其他功能可以使我的查询更加优化

select MONTH(sale_date) AS MOIST,CASE WHEN MONTH(sale_date) = 1  THEN A 
                                      WHEN MONTH(sale_date) = 2 THEN B 
                                      WHEN MONTH(sale_date) = 3 THEN C
                                      WHEN MONTH(sale_date) = 4 THEN  D 
                                      else E 
                                 END as value

有什么理由让它变得更加简单和优化

2 个答案:

答案 0 :(得分:3)

您可以为1969-12-31 22:55:00 使用替代语法:

case

您也可以使用select MONTH(sale_date) AS MOIST, (CASE MONTH(sale_date) WHEN 1 THEN A WHEN 2 THEN B WHEN 3 THEN C WHEN 4 THEN D ELSE E END) as value

OUTER APPLY

select month(sale_date), coalesce(v.val, E) from . . . outer apply (select val from (values (1, A), (2, B), (3, C), (4, D) ) v(mon, val) where v.mon = month(sale_date) ) v

LEFT JOIN

答案 1 :(得分:2)

如果您的意思是“ A”,“ B”,“ C”,“ D”,则:

select MONTH(sale_date) AS MOIST,CASE WHEN MONTH(sale_date) <= 4  THEN CHAR(MONTH(sale_date) + 64) 
                                      else E 
                                 END as value

如果这些值是其他值,您可以找到上述便捷的模式,请使用它。如果不是,则实现一个存储的函数,该函数以1、2、3或4作为参数并返回正确的值,例如:

select MONTH(sale_date) AS MOIST,CASE WHEN MONTH(sale_date) <= 1  THEN myFunction(sale_date) 
                                      else E 
                                 END as value

甚至:

select MONTH(sale_date) AS MOIST,myFunction(sale_date) as value