トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

3-3 nullでないデータの中で最小のデータを取得

SQLパズル

Table1のVal1がnullでないデータの中でVal2が最小のデータの、Val3を取得する。
ただし、Table1のVal1が全てnullの場合は、Val2が最小のデータの、Val3を取得する。

------------------------
パターン1
Val1  Val2  Val3
----  ----  ----
1111  3333  5555
2222  4444  6666
null  1111  7777

出力結果
Val3
----
5555

------------------------
パターン2
Val1  Val2  Val3
----  ----  ----
null  3333  5555
null  4444  6666
null  1111  7777

出力結果
Val3
----
7777


データ作成スクリプト

create table Table1(
Val1 number(4),
Val2 number(4),
Val3 number(4));

--パターン1
delete from Table1;
insert into Table1 values(1111,3333,5555);
insert into Table1 values(2222,4444,6666);
insert into Table1 values(null,1111,7777);
commit;

--パターン2
delete from Table1;
insert into Table1 values(null,3333,5555);
insert into Table1 values(null,4444,6666);
insert into Table1 values(null,1111,7777);
commit;


SQL

--■■■case式を使う方法■■■
select Val3
from Table1
where Val2 = case when     exists(select 1 from Table1 b where b.Val1 is not null)
                  then (select min(b.val2) from Table1 b where b.Val1 is not null)
             else      (select min(b.val2) from Table1 b) end;

--■■■分析関数を使う方法■■■
select Val3
from (select Val3,
      Row_Number() over(order by nvl2(Val1,0,1),Val2) as rn
        from Table1)
 where rn = 1;


解説

case式による分岐を使えば
nullのデータがある場合とない場合の条件分岐が可能です。
分析関数を使うほうがシンプルだと思いますが ;-)