2013-07-18 21 views
0

我已經採用這種方式來實現可參數化查詢。 你知道任何變種嗎?Oracle:如何使用啓用/禁用來編寫查詢WHERE條件

WITH temp AS (SELECT 'case1' case FROM DUAL) 
SELECT 1 
    FROM temp 
WHERE ( (1 = DECODE (case, 'case1', 1, 0)) 
      AND SYSDATE > TO_DATE ('01/01/2013', 'DD/MM/YYYY')) 
     OR ( (1 = DECODE (case, 'case2', 1, 0)) 
      AND SYSDATE < TO_DATE ('01/01/2013', 'DD/MM/YYYY')) 
+2

這將是更好,如果你告訴我們你是什麼真的試圖實現,這看起來'奇怪'目前 – Andrew

+0

具有放鬆條件的參數查詢。我想創建一個獨特的視圖,可以啓用/禁用where的條件。 – Revious

回答

3

您可以使用情況

WITH temp AS (SELECT 'case1' _case FROM DUAL) 
SELECT 1 
    FROM temp 
WHERE 
1 = case 
     when _case = 'case1' 
     AND SYSDATE > TO_DATE ('01/01/2013', 'DD/MM/YYYY') 
     then 1 
     when _case = 'case2' 
     AND SYSDATE > TO_DATE ('01/01/2013', 'DD/MM/YYYY') 
     then 1 
     else 0 
    end 
; 
2

這看起來很尷尬。你可以只用基本邏輯做到這一點:

WITH temp AS (SELECT 'case1' case FROM DUAL) 
SELECT 1 
FROM temp 
WHERE ((case = 'case1') and SYSDATE > TO_DATE('01/01/2013', 'DD/MM/YYYY')) or 
     ((case = 'case2') and SYSDATE < TO_DATE('01/01/2013', 'DD/MM/YYYY')) 
0

爲什麼不使用功能:

CREATE FUNCTION x (p_case IN VARCHAR2, p_date IN VARCHAR2) 
RETURN INTEGER 
IS 
BEGIN 
     IF p_case = 'case1' AND TO_DATE(p_date, 'DD/MM/YYYY') < SYSDATE THEN RETURN 1; 
     ELSE IF p_case = 'case2' AND TO_DATE(p_date, 'DD/MM/YYYY') < SYSDATE THEN RETURN 1; 
     ELSE RETURN 0; 
     END IF; 
END; 

SELECT 1 FROM dual WHERE x('case1', '01/01/2013') = 1;