2013-11-15 140 views
0

我试图在SQL中的where子句中插入多个if语句。如果位置= 1,则使用日期范围keydate> = '09/30/13 23:00:00.000'和关键日期<'10/31/13 23:00:00.000',如果位置= 2则是另一个日期范围。在SQL中的where子句中使用多个if语句

我想这样做的原因是因为我对不同的时区有很多查询,我想将所有这些合并为一个。以下是该查询的简化示例。

我读过有关使用情况报表和布尔逻辑的方式来解决类似的问题,但不能弄清楚这是否会为多种标准(即多个办公ID)工作

也写作的语法是具有挑战性,由于我缺乏经验。

select sum(r.revenue) as revenue 
from customer_stats 
where cus.office_id = '1' --would like to insert "if" cus.office_id = 1 then use keydate 
and keydate >= '09/30/13 23:00:00.000' and keydate < '10/31/13 23:00:00.000' 

回答

0

这一切都在你如何嵌套你的where子句。

select sum(r.revenue) as revenue 
from customer_stats 
where 
    (
     cus.office_id = '1' 
     and keydate >= '09/30/13 23:00:00.000' 
     and keydate < '10/31/13 23:00:00.000' 
    ) 
    OR 
    (
     cus.office_id = '2' 
     and keydate >= '08/30/13 23:00:00.000' 
     and keydate < '09/31/13 23:00:00.000' 
    ) 
+0

感谢您的快速回答!我现在会试试这个。测试多个办公室之前的一个问题是:这会成倍增加执行时间,还是会线性增加执行时间? – user2996849

+0

它不会是指数。只要确保将office_id和keydate编入索引并且查询应该非常快。 –

+0

hm我在两个小办公室尝试了这种方法,并在30分钟后停止了查询。我大大缩小了标准,并使用OR的工作,但如果我使用了所有办公室ID,我认为查询需要几天时间才能完成,这是行不通的。 – user2996849

0

您可以使用“解码”功能。下面是语法

DEOCDE(expr,s1,r1,s2,r2,....., default) 

所以,如果表达式 'expr的' 等于S1,它会返回R1;对于s2,r2;如果没有匹配时,将考虑缺省值..这里有一个例子片断您可以在查询中使用...

DECODE(X,'A',50,'B',10,50) 

所以上面的代码将返回50,如果X =“A”; 10如果X ='B'默认为Orelse 50. 希望这会有所帮助:)