IF语句中的SELECT语句

时间:2015-07-14 11:18:53

标签: if-statement plsql reportbuilder3.0

当参数为0,1或2时,我想得到与select语句不同的结果。我不熟悉PLSQL,所以我不确定我的代码是否会给出预期的结果。如果我运行此代码,我会忽略" SQL语句"在第3行。

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语句的工作原理。这可能对我上面的代码有帮助。不幸的是,这段代码也不起作用,但我认为它可以更好地解释我的情况。在这个例子中,我使用一个单独的表格来构建数据。在某些情况下,user2为null,但始终填充user1。我想获取user2等于参数的所有项目,但如果user2为null且user1与参数相等,我仍然需要该项目为apear。

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)

1 个答案:

答案 0 :(得分:0)

由于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)