我们正在构建一个报告,其中将某些值与阈值进行比较。逻辑是
if value > lower_threshold and value < upper_threshold then PASS else FAIL
但是,对于某些参数,upper_thresholds设置为NULL。从本质上讲,这意味着没有上限,如果值<= lower_threshold,则只会失败,否则将始终为PASS。 我们正在使用Oracle SQL构建查询。由于将任何值与NULL进行比较将始终返回FALSE,因此报表无法正常工作。一种选择是:
if value > lower_threshold and value < nvl(upper_threshold, 9999999999999999) then PASS else FAIL
这不是一个好方法。还有其他选择可以实现相同目标吗?
答案 0 :(得分:6)
or
浮现在脑海:
if value > lower_threshold and (value < upper_threshold or upper_threshold is null) then PASS else FAIL
当然,对于表达式,您将使用case
并在where
子句中进行过滤:
where value > lower_threshold and (value < upper_threshold or upper_threshold is null)
答案 1 :(得分:0)
由于包含较低范围,因此不完全是您想要的,但是也许您可以考虑使用temporal validity语法(需要12.1或更高版本)。
create table demo_ranges
( description varchar2(20) not null
, lower_threshold number unique
, upper_threshold number unique
, check ( upper_threshold > lower_threshold ) );
alter table demo_ranges add period for threshold_range (lower_threshold, upper_threshold);
insert all
into demo_ranges values ('Blue', 0, 10)
into demo_ranges values ('Purple', 10, 20)
into demo_ranges values ('Green', 20, 50)
into demo_ranges values ('Yellow', 50, 100)
into demo_ranges values ('Orange', 100, 200)
into demo_ranges values ('Red', 200, null)
select null from dual;
结果:
select * from demo_ranges as of period for threshold_range 100;
DESCRIPTION LOWER_THRESHOLD UPPER_THRESHOLD
-------------------- --------------- ---------------
Orange 100 200
select * from demo_ranges as of period for threshold_range 1000;
DESCRIPTION LOWER_THRESHOLD UPPER_THRESHOLD
-------------------- --------------- ---------------
Red 200
在内部它构建与Gordon的答案相同的SQL(您可以使用dbms_utility.expand_sql_text
进行确认)。