トップページに戻る
次の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のデータがある場合とない場合の条件分岐が可能です。
分析関数を使うほうがシンプルだと思いますが ;-)