当参数为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)
答案 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)