こんにちは、さるまりんです。
今回は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はいろんなプログラミング言語のifやswitchのような条件分岐ができます。
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を使ってやってみました。
あまりにもややこしすぎる条件は読みにくくなってしまうかもしれないですが、データベースはデータを扱う専門のものなのでそちらに処理をまかしたほうが効率良いことが多いので色々知っていきたいと思います。
読んでくださってありがとうございました。
それではまた!