2010-11-02 99 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