Wil*_*son 2 null oracle select oracle-12c
我有一张road_age_test桌子:
create table road_age_test (
surface_year int,
base_year int
);
insert into road_age_test (surface_year, base_year) values (10,20);
insert into road_age_test (surface_year, base_year) values (30,null);
insert into road_age_test (surface_year, base_year) values (null,40);
insert into road_age_test (surface_year, base_year) values (null,null);
insert into road_age_test (surface_year, base_year) values (50,50);
commit;
select * from road_age_test;
SURFACE_YEAR BASE_YEAR
------------ ----------
10 20
30 null
null 40
null null
50 50
Run Code Online (Sandbox Code Playgroud)
我想从每一列中选择最大值,即使其中一个值为空:
GREATEST_YEAR
-------------
20
30
40
null
50
Run Code Online (Sandbox Code Playgroud)
什么是最简单的方法来做到这一点?
注意:如果两个值都是null,我想返回null,而不是0。
select
GREATEST(nvl(surface_year,0),nvl(base_year,0)) as greatest_year
from
road_age_test;
--Edit using NULLIF
select
NULLIF(GREATEST(nvl(surface_year,0),nvl(base_year,0)),0) as greatest_year
from
road_age_test;
--Adding a segmented version for readability (some find it worse, eye of the beholder I guess)
select
NULLIF(
GREATEST(
nvl(surface_year,0),
nvl(base_year,0) --Just keep adding columns here if you need to
)
,0) as greatest_year
from
road_age_test;
Run Code Online (Sandbox Code Playgroud)
无法想象它的效率要高得多(并且由于索引而不应在 where 子句中使用),但它比 case 语句更简洁,并允许您轻松添加更多值(列)。
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions060.htm