2012-08-06 75 views
0

我有一个场景,我试图根据select语句中的条件从字段/列检索多个值。我试图使用Case语句,但问题是Case语句不支持字段/列中的多个值。有没有任何解决这个或任何其他方式来实现这一目标?在CASE语句中处理多个值?

SELECT col1, col2, col3, Period   
FROM tblMonthlyCost 

WHERE Period = CASE 

    WHEN Datepart(MONTH, Getdate()) = 8 
     AND Datediff(DAY, '07/31/2012', Getdate()) <= 3 THEN Period IN 
      ('0112','0212','0312','0412','0512','0612') 
    WHEN Datepart(MONTH, Getdate()) = 8 
     AND Datediff(DAY, '07/31/2012', Getdate()) > 3 THEN Period IN 
     ('0112','0212','0312','0412','0512','0612','0712')  
END 
+0

可能重复的[如何评估WHERE子句中的输入(http://stackoverflow.com/questions/11732423/how-to-evaluate-an-input-in-the-where-clause ) – LittleBobbyTables 2012-08-06 17:23:26

+1

在查询中使用'GetDate()'追求一个移动的目标,影响性能,并可能产生好奇的结果,例如随着日期的变化。在变量中捕获当前日期/时间几乎总是一个更好的主意,然后根据需要使用该值。在存储过程中,这在多个语句中更重要。多次使用'GetDate()'的最常见原因是捕获长时间运行操作的开始和结束时间。 – HABO 2012-08-06 17:31:59

+0

[CASE IN statement with multiple values]可能重复(http://stackoverflow.com/questions/7449509/case-in-statement-with-multiple-values) – mdb 2012-08-06 17:38:02

回答

2

为什么不这样做呢?

SELECT col1, 
     col2, 
     col3, 
     Period 
FROM tblMonthlyCost 
WHERE Period IN ('0112', '0212', '0312', '0412', '0512', '0612') 
     AND DATEPART(MONTH, GETDATE()) = 8 
     AND DATEDIFF(DAY, '07/31/2012', GETDATE()) <= 3 
     OR Period IN ('0112', '0212', '0312', '0412', '0512', '0612', '0712') 
     AND DATEPART(MONTH, GETDATE()) = 8 
     AND DATEDIFF(DAY, '07/31/2012', GETDATE()) > 3 
+0

您可以将常见的第8个月检查和常见期间,即“0712”以外。 – HABO 2012-08-06 17:35:51

+0

同意了,我并没有真的试图“修复”查询。只是OP所质疑的逻辑。 – SQLMason 2012-08-06 17:41:14

+0

丹的查询修复正是我所需要的,而且它工作得很好!另一个建议将在我正在开发的另一个查询中正常工作。谢谢你的答案。 – user1579850 2012-08-07 19:17:14