SQLでの文字列置換についてまとめています。
MySQLのサンプルデータベースEmployeesを使用しています。
SQLの文字列置換は、replaceを使用
SQLで文字列の一部を置換するには、replaceを使います。※MySQLの場合
第一引数に対象文字列、第二引数に置換前文字列、第三引数に置換後文字列を指定します。なお、第三引数を省略すると、置換対象部分が削除されます。
以下は、dog and catのdogをmouseに置換するサンプルコードです。
mysql> select replace('dog and cat', 'dog', 'mouse' ); +-----------------------------------------+ | replace('dog and cat', 'dog', 'mouse' ) | +-----------------------------------------+ | mouse and cat | +-----------------------------------------+ 1 row in set (0.00 sec)
複数文字列の置換は、replaceを入れ子にする
複数の文字列を同時に置換するには、replaceを入れ子構造にすることで実現できます。
以下は、dog and catのdog→mouse、cat→nekoに置換するサンプルコードです。dog and catという文字列が、mouse and nekoに置換されました。
mysql> select replace(replace('dog and cat', 'dog', 'mouse' ), 'cat', 'neko'); +-----------------------------------------------------------------+ | replace(replace('dog and cat', 'dog', 'mouse' ), 'cat', 'neko') | +-----------------------------------------------------------------+ | mouse and neko | +-----------------------------------------------------------------+ 1 row in set (0.00 sec)
【関連記事】
▶SQLのREPLACE関数を用いた置換機能 使用方法を徹底的に解説
複数文字列の置換は、case式を組み合わせると簡潔に記述できる
入れ子にする方法は2つくらいなら良いですが、さらに多くのキーワードを複数同時置換する場合に、コードが読みづらくなります。
case式とreplaceを組み合わせると、置換対象のキーワードが増えてもスッキリ記述できます。
こちらは、employees(社員)テーブルから、first_name(姓名の名)、last_name(姓名の姓)、gender(性別)を取得するSQLコード。
mysql> select first_name, last_name, gender from employees limit 10; +------------+-----------+--------+ | first_name | last_name | gender | +------------+-----------+--------+ | Georgi | Facello | M | | Bezalel | Simmel | F | | Parto | Bamford | M | | Chirstian | Koblick | M | | Kyoichi | Maliniak | M | | Anneke | Preusig | F | | Tzvetan | Zielinski | F | | Saniya | Kalloufi | M | | Sumant | Peac | F | | Duangkaew | Piveteau | F | +------------+-----------+--------+ 10 rows in set (0.01 sec)
上記のSQLを少し修正してみましょう。
下記のように、case式のwhenで対象カラムにパターンマッチをおこない、replace関数を実行します。今回は、genderがMならDansei、FならJoseiと文字列を置換しています。
今回のケースでは、対象が一文字なのでlike ‘%M%’とワイルドカード指定はしなくても良いのですが、汎用性を考えてこのようにしました。
mysql> select first_name, last_name, -> case -> when gender like '%M%' then replace(gender, 'M', 'Dansei') -> when gender like '%F%' then replace(gender, 'F', 'Josei') -> end as seibetu -> from employees limit 10; +------------+-----------+---------+ | first_name | last_name | seibetu | +------------+-----------+---------+ | xGeorgi | Facello | Dansei | | Bezalel | Simmel | Josei | | Parto | Bamford | Dansei | | Chirstian | Koblick | Dansei | | Kyoichi | Maliniak | Dansei | | Anneke | Preusig | Josei | | Tzvetan | Zielinski | Josei | | Saniya | Kalloufi | Dansei | | Sumant | Peac | Josei | | Duangkaew | Piveteau | Josei | +------------+-----------+---------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ
なお、Oracle、SQL Server、PostgreSQLともreplace関数が使用可能です。
まとめ
- 文字列の置換をおこなうには、replace関数を使う
- 複数の文字列置換を同時におこなうには、replace関数を入れ子にする
- 複数の文字列置換で、置換対象の数が多い場合は、case式と組み合わせると簡潔に記述可能。