在Oracle PL / SQL中为WHERE子句添加条件

时间:2017-12-11 01:17:58

标签: sql oracle visual-studio reporting-services parameters

我正在尝试创建一个报告,允许用户通过在Oracle PL / SQL中添加 Product_No 的参数来过滤掉他们想要查看的产品。我正在使用与Oracle数据库连接的SQL Server Reporting Services到我的报告中。

我的挑战是,如果用户未输入任何 Product_No ,则我的报告应返回所有产品。

虽然 Product_No 已经在我的SELECT子句中了,但我觉得在WHERE子句中添加一些条件应该可行。

但是我的代码出了问题,如果我没有输入 Product_No ,它会返回NULL(如果我输入Product_No,那么它可以工作):

select Product_No, Product_Name
from Product_Table
where (:Product_No is null) OR
     ((:Product_No is not null) AND Product_No IN (:Product_No)) 

我简化了我的代码,以确保我有意义。有人能给我一些建议吗?赞赏它。

3 个答案:

答案 0 :(得分:1)

阅读完这篇文章(How to handle optional parameters in SQL query?)之后,我测试了以下代码,它可以运行:

WHERE Product_No = nvl(:Product_No, Product_No)

基本上,如果用户定义的值为NULL, nvl()将返回Product_No。

然而,我猜测性能没有得到高度优化,因为它会检查表中的每一行。我对任何更好的想法持开放态度......

答案 1 :(得分:1)

您可以创建基于函数的索引

create index idx_prod_no on Product_Table (nvl2(Product_No,1,0));

并运行统计信息包使索引生效:

exec dbms_stats.gather_table_stats(myschema,'Product_Table',cascade=>true);

并使用此条件来提高性能:

where nvl2(Product_No,1,0) = nvl2(:Product_No,1,0)

您可以使用execution plan来测试它,以显示index usage

SQL>set autotrace on;
SQL>var Product_No number; -- to see the results for NULL values
SQL>select Product_No, Product_Name
     from Product_Table
    where nvl2(Product_No,1,0) = nvl2(:Product_No,1,0);/

SQL>var Product_No number=1; -- to see the results for Product_No = 1 (as an example)
SQL>select Product_No, Product_Name
     from Product_Table
    where nvl2(Product_No,1,0) = nvl2(:Product_No,1,0);/

答案 2 :(得分:0)

我不熟悉Oracle,但基于我将如何使用SQL Server进行此操作,我猜...

select Product_No, Product_Name
from Product_Table
where (:Product_No is null) OR Product_No IN (:Product_No)