Sql Oracle:如何使用启用/禁用WHERE条件编写查询

Sql Oracle:如何使用启用/禁用WHERE条件编写查询,sql,oracle,Sql,Oracle,我曾经想过用这种方法来实现一个可参数化的查询。 你知道什么变体吗 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, '

我曾经想过用这种方法来实现一个可参数化的查询。 你知道什么变体吗

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'))

这似乎很尴尬。您只需使用基本逻辑即可做到这一点:

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'))

这似乎很尴尬。您只需使用基本逻辑即可做到这一点:

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'))

为什么不使用函数:

 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;

为什么不使用函数:

 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;
您可以使用这个用例

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 
; 
您可以使用这个用例

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 
; 

如果您告诉我们您真正想要实现的是什么,那就更好了。在当前的参数查询中,这看起来很“奇怪”,条件是可放宽的。我想创建一个独特的视图,可以启用/禁用where条件。如果您告诉我们您真正想要实现的是什么,那就更好了。目前,这看起来很“奇怪”,一个具有可放宽条件的参数查询。我想创建一个独特的视图,可以启用/禁用where条件。