トップページに戻る    次の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以下というロジックを使ってます。