SQLでは文字列の操作もいろいろできます。どのようなことができるのか、まずはそれを確かめましょう。
今回は、以下のテーブルを使って、代表的な文字列操作関数を見ていきす。
> SELECT * FROM stuff; +------+--------------------------+------+ | name | description | age | +------+--------------------------+------+ | 大崎 | 会長 | 66 | | 岡本 | 社長 | 53 | | 松本 | ダウンタウン、浜田の相方 | 55 | +------+--------------------------+------+
SUBSTRING関数
ある文字列の何文字目から何文字目までを切り出したい場合はSUBSTRING関数を使います。
> SELECT SUBSTRING(description,2,3) FROM stuff; +----------------------------+ | SUBSTRING(description,2,3) | +----------------------------+ | 長 | | 長 | | ウンタ | +----------------------------+
SUBSTRING関数は、引数の数で出力する値を変えることもできます。以下はその例です。
> SELECT SUBSTRING(description,2) FROM stuff; +--------------------------+ | SUBSTRING(description,2) | +--------------------------+ | 長 | | 長 | | ウンタウン、浜田の相方 | +--------------------------+
これは2文字目から最後まで全部取り出すことになります。第3引数がないとこのような動作となります。
CONCAT関数
文字列を切り出すのがSUBSTRING関数ですが、その逆で、文字列をくっつけるのがCONCAT関数です。
> SELECT CONCAT(name,description) FROM stuff; +------------------------------+ | CONCAT(name,description) | +------------------------------+ | 大崎会長 | | 岡本社長 | | 松本ダウンタウン、浜田の相方 | +------------------------------+
CONCAT関数は、引数同士を連結します。上記例では引数の数は「name」列と「description」列の2つですが、3個でも4個でも必要な数だけ追加して連結することができます。
ただ、このままでは見にくいので、くっつけるときに間にカンマなどの区切り文字を入れたい場合があります。そのような場合は、以下のように記述することで一応できます。
> SELECT CONCAT(name,',',description) FROM stuff; +-------------------------------+ | CONCAT(name,',',description) | +-------------------------------+ | 大崎,会長 | | 岡本,社長 | | 松本,ダウンタウン、浜田の相方 | +-------------------------------+
ただ、この書き方だと、引数の数が増えれば増えるだけ、カンマを書かなければならず面倒です。その場合、CONCAT_WS関数を使うと便利です。
> SELECT CONCAT_WS(',',name,description) FROM stuff;
+---------------------------------+
| CONCAT_WS(',',name,description) |
+---------------------------------+
| 大崎,会長 |
| 岡本,社長 |
| 松本,ダウンタウン、浜田の相方 |
+---------------------------------+
WSはWith Separatorの略で、第1引数で区切り文字(Separator)を指定することで、後は勝手に区切り文字を挿入して表示してくれます。
GROUP_CONCAT関数
MySQLにはおもしろい関数が結構あります。このGROUP_CONCAT関数もそのひとつです。まずは以下の例を見てください。
> SELECT GROUP_CONCAT(name) FROM stuff; +--------------------+ | GROUP_CONCAT(name) | +--------------------+ | 大崎,岡本,松本 | +--------------------+
全検索した「name」列の値を全て連結しています。連結する値はWHERE句で絞り込むこともできます。
> SELECT GROUP_CONCAT(name) FROM stuff WHERE age > 54; +--------------------+ | GROUP_CONCAT(name) | +--------------------+ | 大崎,松本 | +--------------------+
「age」列の値が54より大きい行の「name」列の値を連結しています。
