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