我正在尝试创建一个报告,允许用户通过在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))
我简化了我的代码,以确保我有意义。有人能给我一些建议吗?赞赏它。
答案 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)