2010-11-02 96 views
5

请耐心等待,这很难解释,我不确定我是否使用了正确的术语。SQL:条件选择内的条件选择

我需要做一个相当复杂的选择。它实际上是一个select语句,它有条件地决定使用哪个字段来过滤select。如果某个日期字段不为空,我需要检查该字段中的值是否在一定范围内。否则,如果该日期字段为空,我需要检查在同一个表的另一个领域,INT场,是在一定范围内:

伪代码:

If [Date] is not null 
    Get sum (table.value) for rows Date >= dateValue and Date < dateValue 
Else 
    Get sum (table.value) for rows Int >= intValue and Int < intValue 

我当前的尝试:

SELECT CASE WHEN a.Date IS NOT NULL THEN 
(SUM(CASE WHEN (a.Date >= cal.Date) THEN ABS(a.Value) ELSE 0 END)) 
ELSE 
(SUM(CASE WHEN (b.Days >= 0) THEN ABS(a.Value) ELSE 0 END) 
END AS 'A' 

有什么建议吗?询问你是否需要更多信息。 在此先感谢。

+0

请检查我的编辑 – gbn 2010-11-02 20:52:35

+0

是的。干杯。我最初有一条或一条语句,但即使日期字段包含数据但不在该范围内,整数字段也会被拖动。没想到在那里添加一个空检查!哎哟! – Damien 2010-11-02 20:57:25

回答

4

一种方法是将2个单独的查询UNION在一起,但只有一个子句会产生一个值。这避免了OR语句。

SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Date >= dateValue and Table.Date < dateValue --NULL Date = false always 
UNION ALL 
SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Int >= intValue and Table.Int < intValue 
    AND --ignore this clause if date is NOT NULL 
    MyTable.Date IS NULL 

编辑,用OR:

SELECT SUM(Value) 
FROM MyTable 
WHERE 
    (
     MyTable.Date IS NOT NULL AND 
     MyTable.Date >= dateValue and Table.Date < dateValue 
    ) 
     OR --actually mutually exclusive 
    (
     MyTable.Date IS NULL AND 
     MyTable.Int >= intValue and Table.Int < intValue 
    ) 
+0

这将返回两个单独的总和,而不是两个可能条件的总和。很难说出原来的海报究竟在问什么,但这听起来像是目标只是一个单一的价值。 – 2010-11-02 20:45:01

+0

@Sam:为什么呢?第1条不给出行,DATE为NULL,所以适用第2条。并且DATE的子句2测试为NULL ...如果NOT NULL子句1将给出行(如果范围过滤器当然是真的)。如果你愿意,你可以添加DATE IS NOT NULL到第一个子句 – gbn 2010-11-02 20:47:08

+0

是的,对不起,这很难解释。我实际上有多行结果,但由于不值得进入的原因,该行被确定为处于特定范围内,具有日期字段或整数字段,而不是两者。日期字段优先,但如果它是空的,我使用整数字段,但一旦选择,我会得到相同的值,而不管它如何选择。唷。 – Damien 2010-11-02 20:49:53

1

这个工作,是不是所有的已经不远了从伪代码,只要我解释要正确地做什么。

SELECT SUM(Value) 
FROM T 
WHERE 
     CASE WHEN DateValue IS NOT NULL 
       THEN DateValue BETWEEN FromDate AND ToDate 
       ELSE IntValue BETWEEN FromInt AND ToInt 
       END