SQLのconcatについてまとめています。
SQLのconcatの使い方
CONCATはCONCATENATEの略で「文字連結する」関数
mysql> select concat(emp_no, ' : ', first_name, ' ', last_name) from employees limit 10; +---------------------------------------------------+ | concat(emp_no, ' : ', first_name, ' ', last_name) | +---------------------------------------------------+ | 10001 : Georgi Facello | | 10002 : Bezalel Simmel | | 10003 : Parto Bamford | | 10004 : Chirstian Koblick | | 10005 : Kyoichi Maliniak | | 10006 : Anneke Preusig | | 10007 : Tzvetan Zielinski | | 10008 : Saniya Kalloufi | | 10009 : Sumant Peac | | 10010 : Duangkaew Piveteau | +---------------------------------------------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQL concat 複数文字列を連結する NULLが入っていた場合は無視
concat_wsは区切り文字を指定する
MySQL、SQL Server、PostgreSQLでは、concat_wsを使って文字列間の区切り文字を指定することが可能です。
以下は、3つのカラムの区切り文字にカンマを指定して文字列連結した例です。
mysql> select concat_ws(',', emp_no, first_name, last_name) from employees limit 10; +-----------------------------------------------+ | concat_ws(',', emp_no, first_name, last_name) | +-----------------------------------------------+ | 10001,Georgi,Facello | | 10002,Bezalel,Simmel | | 10003,Parto,Bamford | | 10004,Chirstian,Koblick | | 10005,Kyoichi,Maliniak | | 10006,Anneke,Preusig | | 10007,Tzvetan,Zielinski | | 10008,Saniya,Kalloufi | | 10009,Sumant,Peac | | 10010,Duangkaew,Piveteau | +-----------------------------------------------+ 10 rows in set (0.00 sec)
「カラム間に区切り文字を入れる」「最後のカラムの後ろには区切り文字を入れない」というのは手動でおこなうと結構面倒です。csv形式の出力をおこないたいときなどに、役立つでしょう。
【関連記事】
▶SQLでカンマ区切りを扱うサンプルコード集 formatやCSV、group_concatの例
連結文字列に1つでもNULLが含まれていると、結果がNULLになる
MySQL、Oracle、PostgreSQLでは、連結文字列にNULLが1つでもあると、結果がNULLになります。以下はMySQLでの実行例です。
mysql> select concat( emp_no, first_name, last_name, NULL) from employees limit 10; +----------------------------------------------+ | concat( emp_no, first_name, last_name, NULL) | +----------------------------------------------+ | NULL | | NULL | | NULL | | NULL | | NULL | | NULL | | NULL | | NULL | | NULL | | NULL | +----------------------------------------------+ 10 rows in set (0.00 sec)
SQL Serverの場合、concat内ではNULLは空文字として扱われるため、結果がNULLにはなりません。プラス記号で連結した場合はNULLになります。
select concat('a','b',NULL); ---- ab select 'a'+'b'+NULL; ---- (null)
なお、SQL ServerにはconcatでのNULL自動変換をオン・オフするためのオプションが用意されています。SET CONCAT_NULL_YIELDS_NULL OFFとすることで、他のDBMS同様、concat内で一つでもNULLが使用されていた場合、結果はNULLとなります。
参考)SET CONCAT_NULL_YIELDS_NULL (Transact-SQL) – SQL Server | Microsoft Docs
まとめ
- SQLのconcatは文字列を連結する関数
- concat_wsで、区切り文字列を指定して連結が可能。CSV形式生成に便利
- concatにNULLが混入していると結果もNULLとなるが、SQL Serverは例外