MySQLで郵便番号をハイフン区切りにして表示したい


こんにちは
varchar(7)なカラムに入っている郵便番号を、表示のときのみハイフン区切りにしたい。

環境情報

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.6.33    |
+-----------+
1 row in set (0.00 sec)

対象にするデータ

  • 今回は NOT NULL で、必ず郵便番号が入っている前提です。
-- こんなかんじ
mysql> select '1234567' AS zip_code;
+----------+
| zip_code |
+----------+
| 1234567  |
+----------+
1 row in set (0.00 sec)

ちゅうい

数値扱いにすると0で始まる北海道、秋田県、岩手県、青森県の郵便番号が欠損してしまうため、文字列として扱いましょう。

-- こうじゃなくて
mysql> SELECT 0000000 AS `number`;
+--------+
| number |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)


-- こう
mysql> SELECT '0000000' AS `string`;
+---------+
| string  |
+---------+
| 0000000 |
+---------+
1 row in set (0.00 sec)

けつろん

mysql> select CONCAT_WS('-', LEFT('1234567', 3), RIGHT('1234567', 4)) AS zip_code;
+----------+
| zip_code |
+----------+
| 123-4567 |
+----------+
1 row in set (0.00 sec)

かんがえかた

  • 元データを2回処理しているのがいけてないですが、RIGHT()LEFT()で以下のように2つに分けます。
--- 左から3文字をとりだす
mysql> select LEFT('1234567', 3) AS zip_code;
+----------+
| zip_code |
+----------+
| 123      |
+----------+
1 row in set (0.00 sec)

--- 右から4文字をとりだす
mysql> select RIGHT('1234567', 4) AS zip_code;
+----------+
| zip_code |
+----------+
| 4567     |
+----------+
1 row in set (0.00 sec)
  • 分離した文字列をCONCAT()CONCAT_WS()で結合しています。
-- 文字列を結合する1
mysql> select CONCAT('123', '-' '4567') AS zip_cd;
+----------+
| zip_cd   |
+----------+
| 123-4567 |
+----------+
1 row in set (0.00 sec)
-- 文字列を結合する2
mysql> select CONCAT_WS('-', 33, 4) AS `なんでや阪神関係ないやろ`;
+--------------------------------------+
| なんでや阪神関係ないやろ             |
+--------------------------------------+
| 33-4                                 |
+--------------------------------------+
1 row in set (0.00 sec)

おわり

もっとスマートな方法もとむ。

参考と注釈