2014年4月16日水曜日

MySQLでsplit的な事をしたい時

MySQLでsplit的な事をしたい時

Splitがしたい

設計上良くないとは思いますが。。。
どうしてもしたい時ってありますよね。。。
例えば郵便番号や電話番号をハイフン毎にカラムを分けて取得したい場合など。

いっぱつでできません。

split関数のようなものはありませんので、関数を組み合わせて自力で分割してやる必要があります。

汎用例

replace(substring(substring_index(${対象項目}, ${区切り文字}, ${対象の位置}), char_length(substring_index(${対象項目}, ${区切り文字}, ${対象の位置} - 1)) + 1), ${区切り文字}, '')

-- 長いな...

具体例: 電話番号 000-000-0000 を3つに分割する
※例はあえて同じ 000 が登場するようにしています

-- 1項目目取得
select replace(substring(substring_index('000-000-0000', '-', 1), char_length(substring_index('000-000-0000', '-', 1 - 1)) + 1), '-', '');
-- > 000

-- 2項目目取得(対象の位置を2に変えた)
select replace(substring(substring_index('000-000-0000', '-', 2), char_length(substring_index('000-000-0000', '-', 2 - 1)) + 1), '-', '');
-- > 000

-- 3項目目取得(対象の位置を3に変えた)
select replace(substring(substring_index('000-000-0000', '-', 3), char_length(substring_index('000-000-0000', '-', 3 - 1)) + 1), '-', '');
-- > 0000

-- 4項目目取得(対象の位置を4に変えた)
select replace(substring(substring_index('000-000-0000', '-', 4), char_length(substring_index('000-000-0000', '-', 4 - 1)) + 1), '-', '');
-- > (なし)

日本語でおk

-- 項目2をとりたい
select replace(substring(substring_index('項目1|項目2|項目3', '|', 2), char_length(substring_index('項目1|項目2|項目3', '|', 2 - 1)) + 1), '|', '');
-- > 項目2

まとめ

すごくめんどくさいので、ちゃんと設計しましょう。
どうしてもダメな場合は汎用例で対応しよう。
Functionをつくったりなんかすると便利かもしれないですね。
でもやっぱり、ちゃんと設計しましょう。

参考

MySQL :: MySQL 5.0 Reference Manual :: 12.5 String Functions / http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

まんなかくらいにある ## Split delimited strings が大変参考になりました。


Written with StackEdit.

  • この記事をシェアする

  • このエントリーをはてなブックマークに追加
  • このブログの更新をチェックする

  • follow us in feedly