ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 条件を分岐させたUPDATE(CASE文応用)

SQL 指南書集 目次 - ray88’s diary

■数値型の列に対し、現在の値を判定対象として別の値へ変えたいというケース
【事例】
以下の条件でテーブルに更新をかける
1.現在の給料が30万円以上の社員は10%減給とする
2.現在の給料が25万円以上28万円以下の社員は、20%の昇給とする

【誤ったSQL
以下のように単純にUPDATE文を2回実行した場合は出力結果が正しくならない。
※1回目の条件1で30万円いじょうの相田さんを10パーセント減給したが
 2回目の条件2で減給した相田さんに対して20パーセント昇給してしまい、
 誤った結果となった

--条件1
UPDATE salaries
	SET salary = salary * 0.9
 WHERE salary >= 300000;
 
--条件2
UPDATE salaries
	SET salary = salary * 1.2
 WHERE salary >= 250000 AND salary < 280000;

【正しいSQL
※最終行のELSE salary は必ず書く。
記載しない場合は条件1,2のどちらにも当てはまらない社員の給料がNULLになる。
CASE式に明示的なELSE句がない場合、デフォルトでELSE NULLとみなす
というCASE式の仕様による。

--正しい更新はCASE式で書く
UPDATE salaries
	SET salary = CASE WHEN salary >= 300000
					  THEN salary * 0.9
					  WHEN salary >= 250000 AND salary < 280000
					  THEN salary * 1.2
					  ELSE salary END;

【参考】
サンプルテーブル作成用SQL

CREATE TABLE salaries
(name VARCHAR(32) PRIMARY KEY,
 salary INTEGER NOT NULL);

INSERT INTO salaries VALUES('相田', 300000);
INSERT INTO salaries VALUES('神崎', 270000);
INSERT INTO salaries VALUES('木村', 220000);
INSERT INTO salaries VALUES('斉藤', 290000);