Case式を知って衝撃を受けた話

こんな記事を書きたくなった訳

最近「達人に学ぶSQL徹底指南書」のKindle版を買って読み始めているのですが、一番最初の章の一番最初の項目で早速目から鱗で電流が走りました。

これまで半年ほどPHPMySQLを使用して業務を行っていたのですが、私の先生は業務で先輩方が書いた既存のコードでした。
そろそろSQLも中級者レベルになったかなと高を括ってこんな本に手を出してみたら、全然知らないことだらけで「先生が教えてくれなかった」なんてゆとり名言も言いたくなるのですよ。
先生は業務で書かれたコードではなく本やネットであることを新しく学び、少しだけ成長した私はこの気持ちを共有したくなったのでこの記事を書くに至りました。

Case式とは

条件分岐です。
ただ、C系列のifステートメントではなく、どちらかというと条件演算子に当たるようなものです。

if (result) { isSuccess = true; }// これではなく
bool isSuccess = result ? true : false;// これ

衝撃を受けたCase式の使い方

垂直でデータを保持しているものを水平に展開することができます。
PHPでこういうデータの整形は頻繁にしてたけど、少しSQLに詳しかったらPHPでいろいろする必要なかったのかと思うと悲しくなります。 

-- テーブル定義
CREATE TABLE enemy_subskills(
    id integer, 
    skill_id integer, 
    subskill_type integer, 
    subskill_level integer);
    
-- データ挿入
INSERT INTO enemy_subskills(id, skill_id, subskill_type, subskill_level) VALUES
(1, 1, 1, 10),
(2, 1, 2, 20),
(3, 2, 1, 10),
(4, 2, 4, 20),
(5, 3, 3, 10),
(6, 3, 4, 20);

-- SQL実行
SELECT
    -- SUMで行をまとめる
    -- subskill_typeが1のとき、subskill_levelをsubskill1_nameカラムに入れる
    SUM(CASE WHEN subskill_type=1 THEN subskill_level ELSE 0 END) AS subskill1_name,
    -- subskill_typeが2のとき、subskill_levelをsubskill2_nameカラムに入れる
    SUM(CASE WHEN subskill_type=2 THEN subskill_level ELSE 0 END) AS subskill2_name,
    -- subskill_typeが3のとき、subskill_levelをsubskill3_nameカラムに入れる
    SUM(CASE WHEN subskill_type=3 THEN subskill_level ELSE 0 END) AS subskill3_name,
    -- subskill_typeが4のとき、subskill_levelをsubskill4_nameカラムに入れる
    SUM(CASE WHEN subskill_type=4 THEN subskill_level ELSE 0 END) AS subskill4_name
FROM enemy_subskills
-- 行をまとめる単位
GROUP BY skill_id;

-- 結果
-- 10   20    0    0
-- 10    0    0   20
--  0    0   10   20

まとめ

中級者だと思っていたらまだまだ初心者だったという話でした。
とりあえずこの手の本を数冊読んで「そこそこ初心者」くらいの称号を手に入れようと思います。
実務でやってても「こなしかた」は覚えていくのに技術は一向に増えていっていない気がするのは気のせいなのか...。
こなすのもスキルではあるけれども。