SQLの構文として、テーブル結合をするためのJOIN句や、条件分岐を表現するためのCASE式があるが、これらはSELECT文だけでなく、UPDATE文でも利用できる。
今回は、Oracle、MySQL、PostgreSQL、SQL Serverの各DB上で、JOIN句とCASE式を含むSQL(SELECT文・UPDATE文)を実行してみたので、その結果を共有する。
前提条件
下記記事のように、A5M2を利用して各DBに接続できていること。
また、各DB上に、以下のデータが設定されていること。(下図はOracleの例)
1 | SELECT * FROM user_data |
1 | SELECT * FROM m_sex |
やってみたこと
Oracleの場合の実行結果
Oracle上でJOIN句とCASE式を含むSQL(SELECT文・UPDATE文)の実行結果は、以下の通り。
1) user_dataテーブル、m_sexテーブルを結合し、CASE式を利用したSELECT文は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT u.* , CASE WHEN u.birth_month = 12 OR u.birth_month BETWEEN 1 AND 2 THEN '冬生まれ:' || s.sex_value || '性' WHEN u.birth_month BETWEEN 3 AND 5 THEN '春生まれ:' || s.sex_value || '性' WHEN u.birth_month BETWEEN 6 AND 8 THEN '夏生まれ:' || s.sex_value || '性' WHEN u.birth_month BETWEEN 9 AND 11 THEN '秋生まれ:' || s.sex_value || '性' ELSE '生年月日_月が不正' END AS memo_aft FROM user_data u INNER JOIN m_sex s ON u.sex = s.sex_cd ORDER BY u.id ASC |
2) user_dataテーブル、m_sexテーブルを結合し、CASE式を利用したUPDATE文は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | UPDATE ( SELECT u.birth_month , u.memo , s.sex_value FROM user_data u INNER JOIN m_sex s ON u.sex = s.sex_cd ) SET memo = ( CASE WHEN birth_month = 12 OR birth_month BETWEEN 1 AND 2 THEN '冬生まれ:' || sex_value || '性' WHEN birth_month BETWEEN 3 AND 5 THEN '春生まれ:' || sex_value || '性' WHEN birth_month BETWEEN 6 AND 8 THEN '夏生まれ:' || sex_value || '性' WHEN birth_month BETWEEN 9 AND 11 THEN '秋生まれ:' || sex_value || '性' ELSE '生年月日_月が不正' END ) |
上記UPDATE文を実行すると、以下のように、左下のコンソール上に更新した件数が表示されることが確認できる。
3) 2)のUPDATE文実行後の、 user_dataテーブルの値は以下の通りで、記載通りの内容で更新されていることが確認できる。
1 | SELECT * FROM user_data |
MySQLの場合の実行結果
MySQL上でJOIN句とCASE式を含むSQL(SELECT文・UPDATE文)の実行結果は、以下の通り。
1) user_dataテーブル、m_sexテーブルを結合し、CASE式を利用したSELECT文は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT u.* , CASE WHEN u.birth_month = 12 OR u.birth_month BETWEEN 1 AND 2 THEN CONCAT('冬生まれ:', s.sex_value, '性') WHEN u.birth_month BETWEEN 3 AND 5 THEN CONCAT('春生まれ:', s.sex_value, '性') WHEN u.birth_month BETWEEN 6 AND 8 THEN CONCAT('夏生まれ:', s.sex_value, '性') WHEN u.birth_month BETWEEN 9 AND 11 THEN CONCAT('秋生まれ:', s.sex_value, '性') ELSE '生年月日_月が不正' END AS memo_aft FROM user_data u INNER JOIN m_sex s ON u.sex = s.sex_cd ORDER BY u.id ASC |
2) user_dataテーブル、m_sexテーブルを結合し、CASE式を利用したUPDATE文は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | UPDATE user_data u INNER JOIN m_sex s ON u.sex = s.sex_cd SET u.memo = ( CASE WHEN u.birth_month = 12 OR u.birth_month BETWEEN 1 AND 2 THEN CONCAT('冬生まれ:', s.sex_value, '性') WHEN u.birth_month BETWEEN 3 AND 5 THEN CONCAT('春生まれ:', s.sex_value, '性') WHEN u.birth_month BETWEEN 6 AND 8 THEN CONCAT('夏生まれ:', s.sex_value, '性') WHEN u.birth_month BETWEEN 9 AND 11 THEN CONCAT('秋生まれ:', s.sex_value, '性') ELSE '生年月日_月が不正' END ) |
上記UPDATE文を実行すると、以下のように、左下のコンソール上に更新した件数が表示されることが確認できる。
3) 2)のUPDATE文実行後の、 user_dataテーブルの値は以下の通りで、記載通りの内容で更新されていることが確認できる。
1 | SELECT * FROM user_data |
PostgreSQLの場合の実行結果
PostgreSQL上でJOIN句とCASE式を含むSQL(SELECT文・UPDATE文)の実行結果は、以下の通り。
1) user_dataテーブル、m_sexテーブルを結合し、CASE式を利用したSELECT文は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT u.* , CASE WHEN u.birth_month = 12 OR u.birth_month BETWEEN 1 AND 2 THEN '冬生まれ:' || s.sex_value || '性' WHEN u.birth_month BETWEEN 3 AND 5 THEN '春生まれ:' || s.sex_value || '性' WHEN u.birth_month BETWEEN 6 AND 8 THEN '夏生まれ:' || s.sex_value || '性' WHEN u.birth_month BETWEEN 9 AND 11 THEN '秋生まれ:' || s.sex_value || '性' ELSE '生年月日_月が不正' END AS memo_aft FROM user_data u INNER JOIN m_sex s ON u.sex = s.sex_cd ORDER BY u.id ASC |
2) user_dataテーブル、m_sexテーブルを結合し、CASE式を利用したUPDATE文は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | UPDATE user_data SET memo = CASE WHEN birth_month = 12 OR birth_month BETWEEN 1 AND 2 THEN '冬生まれ:' || m_sex.sex_value || '性' WHEN birth_month BETWEEN 3 AND 5 THEN '春生まれ:' || m_sex.sex_value || '性' WHEN birth_month BETWEEN 6 AND 8 THEN '夏生まれ:' || m_sex.sex_value || '性' WHEN birth_month BETWEEN 9 AND 11 THEN '秋生まれ:' || m_sex.sex_value || '性' ELSE '生年月日_月が不正' END FROM m_sex WHERE user_data.sex = m_sex.sex_cd |
上記UPDATE文を実行すると、以下のように、左下のコンソール上に更新した件数が表示されることが確認できる。
なお、PostgreSQLでは、UPDATE文のテーブルに別名を付与することができない。詳細は以下のサイトを参照のこと。
https://qiita.com/k_0120/items/e61fda2d30c2c57b5e01
3) 2)のUPDATE文実行後の、 user_dataテーブルの値は以下の通りで、記載通りの内容で更新されていることが確認できる。
1 | SELECT * FROM user_data |
SQL Serverの場合の実行結果
SQL Server上でJOIN句とCASE式を含むSQL(SELECT文・UPDATE文)の実行結果は、以下の記事を参照のこと。
要点まとめ
- SQLの構文として、テーブル結合をするためのJOIN句や、条件分岐を表現するためのCASE式があるが、これらは各DB上で、SELECT文だけでなく、UPDATE文でも利用できる。