DBMSごとの文字列を分割する関数
SQLで「文字列を分割したい」と思った時に、どの関数を使えばいいのかわからずに悩んでいるのではないでしょうか?
DBMSには、独自で文字列を分割する機能をもつ関数が用意されています。
そこでこの記事では、DBMSごとに文字列を分割する関数の使い方について解説します。
SUBSTRING関数
SUBSTRING関数は文字列の一部を分割し、取得できる関数です。
「MySQL」と「SQLServer」で使用できます。
SUBSTRING関数の使い方は次の通りです。
SUBSTRING(‘切り取る文字列’, ‘切り取り始める文字位置’, ‘切り取る文字数’);
まず切り取りたい文字列を指定し、切り取りを行いたい位置と文字数を指定すればOKです。
サンプルクエリで実行結果を確認してみましょう。
SELECT SUBSTRING('potepan', 5, 3) AS result;
■実行結果
+--------+ | result | +--------+ | pan | +--------+ 1 row in set (0.01 sec)
5文字目の「p」から切り取りを開始し、3文字分切り取っています。
その結果「pan」という文字が表示されました。
SUBSTRING関数はWHERE句やUPDATE句の中でも使用可能です。
簡単なサンプルで表示を確認してみましょう。
mysql> SELECT * FROM sb; +------------+ | name | +------------+ | SuzukiHana | | SuzukiMana | | SatouMina | +------------+ 3 rows in set (0.00 sec) mysql> SELECT name FROM sb WHERE SUBSTRING(name, 1, 5) = 'Satou'; +-----------+ | name | +-----------+ | SatouMina | +-----------+ 1 row in set (0.00 sec)
このような感じで、特定の文字列のデータを取得したい場合などに使えます。
また、位置の指定で「文字列を左(右)から○文字取得したい」と思った場合は、LEFT関数/RIGHT関数を使うと便利です。
詳しい使用方法は、「LEFT関数とRIGHT関数の使い方」で説明します!
Mid関数 / MidB関数
Mid関数 / MidB関数も文字列の一部を取得可能な関数です。
「Access」で使用できます。
Mid関数 / MidB関数の使い方は次の通りです。
Mid(‘切り取る文字列’, ‘切り取り始める文字位置’, ‘切り取る文字数’); MidB(‘切り取る文字列’, ‘切り取り始める文字位置’, ‘切り取るバイト数’);
Mid関数が開始位置からの文字数分なのに対し、MidBは開始位置からのバイト数分を取り出します。
なお、切り取る文字数については省略も可能です。
省略した場合は、開始位置以降のすべての文字が返されます。
■使い方
SELECT Mid('potepan', 5, 3); SELECT MidB('potepan', 5, 3);
実行結果は、SUBSTRING関数と同じになるはずです。
切り取る文字数を省略した場合
SELECT Mid('potepanstyle', 5);
■実行結果
panstyle
Accessで文字列を分割するなら、Mid関数 か MidB関数を使おう!
SUBSTR関数 / SUBSTRB関数
SUBSTR関数 / SUBSTRB関数も文字列の一部を分割し、取得可能な関数です。
SUBSTR関数は「Oracle」と「PostgreSQL」で、SUBSTRB関数は「Oracle」で使用できます。
SUBSTR関数 / SUBSTRB関数の使い方は次の通りです。
SUBSTR(‘切り取る文字列’, ‘切り取り始める文字位置’, ‘切り取る文字数’); SUBSTRB(‘切り取る文字列’, ‘切り取り始める文字位置’, ‘切り取るバイト数’);
SUBSTR関数とSUBSTRB関数も、Mid関数/MidB関数と同じように文字数分かバイト数分かで関数を使い分けます。
また、切り取る文字数の省略も可能で、開始位置以降のすべての文字が返されます。
■使い方
SELECT SUBSTR('potepan', 5, 3); SELECT SUBSTRB('potepan', 5, 3);
こちらも実行結果は同じです。
OracleとかPostgreSQLで文字列を分割するなら、SUBSTR関数を使おう!
OracleであればSUBSTRB関数も使えます!
STRING_SPLIT関数
「SQLServer2016」では、STRING_SPLIT関数で「文字区切り文字」を指定し、文字列の一部を分割して取得できます。
使い方は次の通りです。
STRING_SPLIT (‘文字列’ , ‘文字区切り文字‘);
今まで紹介したものとは少し使い方が異なります。
第1引数(文字列)がNULLの場合、戻り値が空の結果セットになり、引数の値がそのまま返ってきます。
また、第2引数(文字区切り文字)に複数の文字を指定してしまうとエラーになるので気をつけましょう。
STRING_SPLIT (‘potepan/style/sql’ , ‘/‘); STRING_SPLIT (‘potepan,style,sql’ , ‘,‘);
■実行結果
value ----------- potepan style sql
このように分割基準の文字ごとに文字列が分割されます。
文字区切り文字には、半角スペースを指定することも可能です。
STRING_SPLIT (‘potepan style sql learning .’ , ‘ ‘);
■実行結果
value ----------- potepan style sql learning .
SQLServer2016で文字列を分割するなら、STRING_SPLIT関数を使おう!
文字区切り文字を指定する、他の関数とは使い方が少し異なる関数です。
LEFT関数とRIGHT関数の使い方
これまで紹介してきた文字列を分割できる関数は、分割開始地点を指定しているものがほとんどでした。
この開始位置を左右で指定できる関数が、LEFT関数 / RIGHT関数です。
それぞれ「左から何文字目」「右から何文字目」といった指定で文字列の分割ができます。
なお、OracleではRIGHT関数は使えません。
LEFT関数 とRIGHT関数の使い方は次の通りです。
LEFT(‘切り取る文字列’, ‘切り取る文字数’); RIGHT(‘切り取る文字列’, ‘切り取る文字数’);
SUBSTRING関数などとは異なり、切り取り始める位置が決まっているので引数は2つでOKです。
切り取る文字列の長さよりも切り取る文字数に大きい数値を指定した場合は、すべての文字列が返され、スペースによるパディングは行われません。
サンプルで表示を確認してみましょう。
mysql> SELECT LEFT('potepan', 4) AS result; +--------+ | result | +--------+ | pote | +--------+ 1 row in set (0.02 sec) mysql> SELECT RIGHT('potepan', 3) AS result; +--------+ | result | +--------+ | pan | +--------+ 1 row in set (0.02 sec)
このように、期待した通りの文字を取得できます。
切り取る文字数に「0」やマイナスの値を指定すると空の結果セットが返り、NULLを指定するとNULLが返ってきます。
mysql> SELECT RIGHT('potepan', 0) AS result; +--------+ | result | +--------+ | | +--------+ 1 row in set (0.01 sec) mysql> SELECT RIGHT('potepan', -1) AS result; +--------+ | result | +--------+ | | +--------+ 1 row in set (0.01 sec) mysql> SELECT RIGHT('potepan', null) AS result; +--------+ | result | +--------+ | NULL | +--------+ 1 row in set (0.01 sec)
まとめ
SQLで文字列を分割できる関数について紹介しました。
最後に、DBMSごとに使える関数をまとめます。
- MySQL:SUBSTRING関数、LEFT関数 、RIGHT関数
- SQLServer:SUBSTRING関数、LEFT関数 、RIGHT関数
- Access:Mid関数、MidB関数、LEFT関数 、RIGHT関数
- Oracle:SUBSTR関数 、SUBSTRB関数、LEFT関数
- PostgreSQL:SUBSTR関数 、SUBSTRB関数、LEFT関数 、RIGHT関数
- SQLServer2016:STRING_SPLIT関数、LEFT関数 、RIGHT関数
文字列分割を行う際は、ぜひこの記事を参考にしてください。
MySQLかSQLServerで文字列を分割するなら、SUBSTRING関数を使おう!