SELECT IF 语句中的语句

SELECT Statement within IF statement

当参数为 0、1 或 2 时,我希望得到与我的 select 语句不同的结果。我对 PLSQL 不是很熟练,所以我不确定我的代码是否会给出预期的结果结果。如果我 运行 这段代码,我会在第 3 行得到一个 "SQL statement ignored"。

BEGIN
IF (:PARTYPE = 1) THEN
SELECT * FROM x
WHERE to_date(date) >= (Select to_date(sysdate)from DNV.dual)
ELSE
SELECT * FROM x
WHERE to_date(date) <= (Select to_date(sysdate)from DNV.dual)
END IF;
END;

这只是我的 SELECT 陈述的一个例子。稍后这个语句会变得更长更复杂,但我认为这显示了我想要得到的结果。

下面是我的全部代码的副本,但由于我不允许展示它,所以它变得非常难以阅读:

BEGIN
IF (:PARTYPE = 1) THEN    
Select table1.Column1
         , table1.Column2
         , table1.Column3
         , table1.Column4
         , table1.Column5
         , table1.Column6
         , table1.Column7
         , table1.Column8
         , table1.Column9
         , table1.Column10
         , table1.Column11
         , table1.Column12
         , (Select table2.ColumnX From x2 table2 Where somthing) as "something"      From x1 table1
        WHERE to_date(date) >= (Select to_date(sysdate)from DNV.dual)
      Order by columnX
ELSE    
Select table1.Column1
         , table1.Column2
         , table1.Column3
         , table1.Column4
         , table1.Column5
         , table1.Column6
         , table1.Column7
         , table1.Column8
         , table1.Column9
         , table1.Column10
         , table1.Column11
         , table1.Column12
         , (Select table2.ColumnX From x2 table2 Where somthing) as "something"      From x1 table1
        WHERE to_date(date) <= (Select to_date(sysdate)from DNV.dual)
      Order by columnX
END IF;
END;

我创建了一些新代码,试图用它来了解 case 语句的工作原理。这可能对我上面的代码有帮助。不幸的是,这段代码也不起作用,但我认为它能更好地解释我的情况。在这个例子中,我使用一个单独的 table 和我制作的数据。在某些情况下,user2 为空,但 user1 始终被填充。我想获取 user2 等于参数的所有项目,但如果 user2 为 null 且 user1 确实等于参数,我仍然需要该项目才能出现。

Select  t1.user1,
        t1.user2
        From table t1
        Where (Case
            When t1.user2 IS NULL Then t1.user1 in (:PARUSER)
            ELSE t1.user2 in (:PARUSER)
        End Case)

由于where子句的关系运算符依赖于partype,所以这里不能使用传统的CASE语句符。我将不得不使用这个:

  SELECT * FROM x
    WHERE (to_date(date) >= (Select to_date(sysdate)from DNV.dual) AND :PARTYPE = 1)
       OR (to_date(date) <= (Select to_date(sysdate)from DNV.dual) AND :PARTYPE != 1)