从每一列中选择最大值,即使其中一个值为空

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

SQL*_*DBA 5

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

  • 关于 *'允许您轻松添加更多值(列)'* 的部分是关键! (2认同)