与 NULL 值的阈值比较

Threshold comparison with NULL value

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

if value > lower_threshold and value < upper_threshold then PASS else FAIL

但是,对于某些参数upper_thresholds 设置为NULL。这实质上意味着没有上限,如果值 <= lower_threshold 则它只会失败,否则它将始终通过。 我们正在使用 Oracle SQL 构建查询。因为,任何值与 NULL 的比较总是 return FALSE,报告未按预期工作。一种选择是:

if value > lower_threshold and value < nvl(upper_threshold, 9999999999999999) then PASS else FAIL

这不是个好办法。有没有其他选择可以达到同样的效果?

想到

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)

不完全是您想要的,因为包含较低的范围,但也许您可以考虑 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 确认这一点)。