阈值与NULL值的比较

时间:2019-08-09 15:52:45

标签: sql oracle threshold

我们正在构建一个报告,其中将某些值与阈值进行比较。逻辑是

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

这不是一个好方法。还有其他选择可以实现相同目标吗?

2 个答案:

答案 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进行确认)。