如何编写SQL WHERE子句实现无参数时获取全量数据
SQL报表参数逻辑调整方案
原需求是报表允许用户输入数据回溯天数(例如输入10天则获取近10天数据),无输入时默认获取近90天数据。现需修改为:无参数输入时获取全部数据,你之前尝试使用NVL函数的代码如下:
Select * From timesheets Where transaction_date between trunc(sysdate-nvl('&Days','90')) and trunc(sysdate)
核心调整思路
原写法用NVL给空参数默认90天,现在要改成空参数时不限制起始日期,只保留截止到当天的筛选(如果不需要截止到当天可去掉transaction_date <= trunc(sysdate)),同时保留输入参数时的近N天逻辑。
修改后的SQL示例
写法一:基础逻辑实现
Select * From timesheets Where transaction_date <= trunc(sysdate) And ( '&Days' IS NOT NULL AND transaction_date >= trunc(sysdate - TO_NUMBER('&Days')) )
- 当
&Days有输入时,同时满足截止到当天和近N天的条件 - 当
&Days为空时,第二个条件不生效,仅筛选截止到当天的全部数据
写法二:兼容空字符串参数
考虑到部分工具中参数为空时'&Days'会是空字符串,用NVL处理转换错误:
Select * From timesheets Where transaction_date <= trunc(sysdate) And ( NVL(TO_NUMBER('&Days'), NULL) IS NULL OR transaction_date >= trunc(sysdate - NVL(TO_NUMBER('&Days'), 0)) )
- 用
NVL(TO_NUMBER('&Days'), NULL)避免空字符串转数字报错 - 参数为空时,
OR后的条件不生效,直接取全部历史数据(截止到当天)
内容的提问来源于stack exchange,提问作者Signil
相关产品推荐
相关产品推荐

