SQLのCASEで条件によって取得するカラムを変える

こんにちは、さるまりんです。

今回はSQLのCASEです。

テーブルcity_recordsにこんなデータがあります。

country state city
日本 東京都 新宿区
アメリカ ニューヨーク ニューヨーク
カナダ ブリティッシュコロンビア バンクーバー
日本 神奈川県 横浜市
イギリス イングランド ロンドン
日本 大阪府 堺市
日本 兵庫県 西宮市
ドイツ ノルトライン=ヴェストファーレン ケルン
アメリカ ワシントン シアトル
アメリカ カリフォルニア ロサンゼルス
日本 宮城県 仙台市
日本 愛知県 名古屋市
オーストラリア ニューサウスウェールズ シドニー
フランス ロワール=アトランティック ナント
メキシコ メキシコシティ メキシコシティ
日本 福岡県 福岡市

countryには国名、stateには州や県、cityには都市名が入っています。

このテーブルから都市名、それと国が日本の場合は都道府県名、それ以外の国の場合は国名を取得するクエリをCASEを使って書いてみます。

SELECT CASE WHEN country = '日本' THEN state
            ELSE country END AS area_name,
       city
FROM city_records

CASEはいろんなプログラミング言語のifswitchのような条件分岐ができます。

CASE
    WHEN 条件1 THEN 結果1
    WHEN 条件2 THEN 結果2
    ELSE 結果ELSE
END

のように複数の条件を指定することもできます。

上のクエリで取れるデータはこうなります。

area_name city
東京都 新宿区
アメリカ ニューヨーク
カナダ バンクーバー
神奈川県 横浜市
イギリス ロンドン
大阪府 堺市
兵庫県 西宮市
ドイツ ケルン
アメリカ シアトル
アメリカ ロサンゼルス
宮城県 仙台市
愛知県 名古屋市
オーストラリア シドニー
フランス ナント
メキシコ メキシコシティ
福岡県 福岡市

このクエリですがカラムcountryの値によって条件分岐しているのでこんな風に書くこともできます。

SELECT CASE country WHEN '日本' THEN state
                    ELSE country END AS area_name,
       city
FROM city_records

こういう形で書きます。

CASE 条件の式
     WHEN 値1 THEN 結果1
     WHEN 値2 THEN 結果2
     ELSE 結果ELSE
END

こちらは条件に別のカラムを使うことができないので、場合に応じて使い分けます。

とあるデータの集計時にこの例のように日本だけは違う処理をしないといけない時があったのでCASEを使ってやってみました。

あまりにもややこしすぎる条件は読みにくくなってしまうかもしれないですが、データベースはデータを扱う専門のものなのでそちらに処理をまかしたほうが効率良いことが多いので色々知っていきたいと思います。

読んでくださってありがとうございました。

それではまた!