トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
7-15 古のSQL(条件分岐その1)
SQLパズル
テストテーブル
ID Point Rank
-- ----- ----
1 0 0
2 25 0
3 40 0
4 100 0
5 125 0
6 140 0
7 300 0
Oracle8で、テストテーブルを以下のように更新する。
Pointが 0以上 10以下なら、Rankを1
Pointが 11以上 50以下なら、Rankを2
Pointが 51以上120以下なら、Rankを3
Pointが121以上130以下なら、Rankを4
Pointが131以上190以下なら、Rankを5
Pointが191以上なら、Rankを99
更新結果
ID Point Rank
-- ----- ----
1 0 1
2 25 2
3 40 2
4 100 3
5 125 4
6 140 5
7 300 99
データ作成スクリプト
create table テスト(
ID number(1),
Point number(3),
Rank number(2));
insert into テスト values(1, 0,0);
insert into テスト values(2, 25,0);
insert into テスト values(3, 40,0);
insert into テスト values(4,100,0);
insert into テスト values(5,125,0);
insert into テスト values(6,140,0);
insert into テスト values(7,300,0);
commit;
SQL
--■■■greatest関数とLeast関数を使う方法■■■
update テスト
set Rank = decode(greatest(Point, 0),Least(Point, 10),1,
decode(greatest(Point, 11),Least(Point, 50),2,
decode(greatest(Point, 51),Least(Point,120),3,
decode(greatest(Point,121),Least(Point,130),4,
decode(greatest(Point,131),Least(Point,190),5,
decode(greatest(Point,191),Point,99))))));
--■■■相関サブクエリを使う方法■■■
update テスト a
set Rank =(select 1 from dual where a.Point between 0 and 10
union all select 2 from dual where a.Point between 11 and 50
union all select 3 from dual where a.Point between 51 and 120
union all select 4 from dual where a.Point between 121 and 130
union all select 5 from dual where a.Point between 131 and 190
union all select 99 from dual where 191 <= a.Point);
解説
case式を使わずに条件分岐を行う、古のSQLです。
greatest関数とLeast関数を使う方法では、
greatest(Point,0)=Pointかつ
Least(Point,10)=Pointならば
Pointは、0以上10以下というロジックを使ってます。