与 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
确认这一点)。
我们正在构建一个报告,其中将某些值与阈值进行比较。逻辑是
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
确认这一点)。