2012-09-18 49 views
-2

我的Oracle SQL查詢這樣IF條件SQL查詢的WHERE子句中

SELECT * 
FROM test 
WHERE 1 =1 
AND req_no IN 
    (SELECT req_no 
    FROM test 
    WHERE date1 IS NOT NULL 
    AND date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 
) 

的問題是WHERE條件不能正常工作。在上述情況下,如果'date1' 不是NULL,那麼我想檢查'FROM'和'TO'日期之間的'date1'。 * 編輯 * 我已經加入樣品表數據

Test table 
From date: 1-JUN-2012 
To date: 30-JUN-2012 

record  date1   date2   date3 
1  12-JUN-2012  13-JUN-2012   12-JUN-2012 
2  null   null    12-JUN-2012 
3  null   3-JUN-2012   null 
4  12-JUN-2012  null    null 
5  12-JUN-2012  13-JUL-2012   12-JUN-2012 
6  null    null    null 

在上面的記錄將返回記錄數= 1,2,3,4不第六紀錄。

+0

這段代碼是不是最好的做法的一個例子但它應該解決你給的業務規則。所以你需要定義「不能正常工作」。最簡單的方法是給我們一些測試數據和你期望的輸出。 – APC

+0

感謝您的建議。我添加了示例數據和輸出 – Raje

+0

@APC:我有示例表數據和輸出 – Raje

回答

0

您可以使用OR這樣的:

WHERE date1 IS NULL 
    OR date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 

你的整個查詢應該是:

SELECT * 
FROM test 
WHERE 1 =1 
AND req_no IN 
    (SELECT req_no 
    FROM test 
    WHERE date1 IS NULL 
    OR date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 
) 
+0

@Raje從你的問題**如果'date1'不是NULL,那麼我想檢查'FROM'之間的'date1'和'TO'約會**這意味着如果Date是'NULL',你不想在兩者之間檢查。對? – hims056

+0

是的。像這樣 – Raje

+0

@Raje然後上述查詢中的條件與你想要的相同。不是嗎? – hims056

0

1=1是多餘的。既然你說你想檢查是否date1的是日期的範圍之間,或者如果它是零,也沒關係,試試:

SELECT * 
FROM test 
WHERE req_no IN 
    (SELECT req_no 
    FROM test 
    WHERE date1 BETWEEN to_date('06/01/2012','mm/dd/yyyy') 
     AND to_date('06/30/2012','mm/dd/yyyy') 
     OR date1 is null 
) 
0

我認爲你不需要子查詢,你可以使用單個查詢 直接選擇您的相關記錄像還你不需要檢查date1爲空或不是

SELECT * FROM test 
    WHERE TO_DATE('12/2/2003','MM/DD/YYYY') <= date1 
AND TO_DATE('12/5/2003','MM/DD/YYYY') >= date1 
0

找到了一些解決方法,但它是非常漫長的

SELECT * 
FROM dates 
WHERE 1 =1 
AND( 
    no IN 
    (SELECT no FROM dates WHERE date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date2 is null and date3 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date2 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date1 is null and date3 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date3 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date1 is null and date2 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date3 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date1 BETWEEN '1-JUN-12' AND '30-JUN-12' and date2 BETWEEN '1-JUN-12' AND '30-JUN-12') 
    or 
    no IN 
    (SELECT no FROM dates WHERE date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date1 BETWEEN '1-JUN-12' AND '30-JUN-12' and date3 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date3 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date3 BETWEEN '1-JUN-12' AND '30-JUN-12' and date2 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date2 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date3 BETWEEN '1-JUN-12' AND '30-JUN-12' and date1 is null) 

) 
+1

啊 - 但這不是最初說明問題的方法。在你的初始描述中,你只是檢查'date1'。如果你沒有完全描述這個問題,你不會得到很多有用的答案。因爲你已經有了六行SELECT條件 - 看起來有點像矯枉過正。 –