SQLのconcatについてまとめています。
concatは、SQL内で文字列を連結する関数です。各データベースでのcontatのサンプルSQLを紹介します。
concatの構文
concatは、複数の文字列を結合する関数です。データベースによっては、カンマなどのセパレーターを挿入する関数が用意されているケースもあります。
MySQLのconat
MySQLのconatのサンプルSQLを見てきましょう。NULLが入っている場合には無視され、数値の場合は暗黙的に文字列に変換されます。
mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> SELECT CONCAT('My', NULL, 'QL'); -> NULL mysql> SELECT CONCAT(14.3,1.5); -> '14.31.5'
参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5 文字列関数
CONCAT_WSは、文字列間にセパレータを挿入する関数です。ただし、NULLが入っていた場合には無視されます。
mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name'); -> 'First name,Second name,Last Name' mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name'); -> 'First name,Last Name'
CSVなどに使う場合は、NULLが含まれていた場合はデフォルト値を返すcoalesce関数などを組み合わせる必要があります。
【関連記事】
▶SQL coalesce 値がNULLの場合の代替値を返す 簡易版のNVLやNULLIFが使えるDBもあり
下記のSQLは、部署名(departments.dept_name)ごとに所属する職種(titles.title)をカンマで連結して部署ごとに1行づつ表示します。
SELECT departments.dept_name, GROUP_CONCAT(DISTINCT titles.title SEPARATOR ',') FROM employees LEFT JOIN dept_emp ON employees.emp_no = dept_emp.emp_no LEFT JOIN departments ON dept_emp.dept_no = departments.dept_no LEFT JOIN titles ON employees.emp_no = titles.emp_no GROUP BY departments.dept_name;
実行するとこうなります。
+--------------------+-----------------------------------------------------------------------------------------+ | dept_name | GROUP_CONCAT(distinct titles.title SEPARATOR ',') | +--------------------+-----------------------------------------------------------------------------------------+ | Customer Service | Assistant Engineer,Engineer,Manager,Senior Engineer,Senior Staff,Staff,Technique Leader | | Development | Assistant Engineer,Engineer,Manager,Senior Engineer,Senior Staff,Staff,Technique Leader | | Finance | Manager,Senior Staff,Staff | | Human Resources | Manager,Senior Staff,Staff | | Marketing | Manager,Senior Staff,Staff | | Production | Assistant Engineer,Engineer,Manager,Senior Engineer,Senior Staff,Staff,Technique Leader | | Quality Management | Assistant Engineer,Engineer,Manager,Senior Engineer,Technique Leader | | Research | Assistant Engineer,Engineer,Manager,Senior Engineer,Senior Staff,Staff,Technique Leader | | Sales | Manager,Senior Staff,Staff | +--------------------+-----------------------------------------------------------------------------------------+
【関連記事】
▶MySQLの文字列結合にはCONCAT。GROUP_CONCATとGROUP BYで複数データ集約
Oracleのconcat 入れ子にして使う例
CONCATを入れ子にした例です。
SELECT CONCAT(CONCAT(last_name, '''s job category is '), job_id) "Job" FROM employees WHERE employee_id = 152; Job ------------------------------------------------------ Hall's job category is SA_REP
SQL Serverのconcat NULLはVarchar(1)空文字として扱う
SELECT CONCAT ( 'Happy ', 'Birthday ', 11, '/', '25' ) AS Result; GO Result ------------------------- Happy Birthday 11/25 (1 row(s) affected)
参考)CONCAT (Transact-SQL) – SQL Server | Microsoft Docs
なお、SQL Serverでは、引数にNULL値が入っていた場合、varchar(1)の空の文字列として扱います。
INSERT INTO #temp VALUES( 'Name', NULL, 'Lastname' ); SELECT CONCAT( emp_name, emp_middlename, emp_lastname ) AS Result FROM #temp; GO Result ------------------ NameLastname (1 row(s) affected)
ProgreSQL パイプライン2つでconcatの代替が可能
select concat('abcde', 2, NULL, 22); abcde222
値がNULLでないことがわかっている場合は、||で接続することで文字列の連結が可能です。
dvdrental=# select 'a'||'b'||'c'; ?column? ---------- abc (1 row)
区切り文字を指定可能な、concat_ws関数も用意されています。
dvdrental=# select concat_ws(',', 'abcde', 2, NULL, 22); concat_ws ------------ abcde,2,22 (1 row)
まとめ
- concatは、複数の文字列を連結する関数。
- 対象の文字列がNULLだった場合は無視される。
- データベースによっては、文字列間にセパレータ文字列を挿入する関数が用意されている。
- PostgreSQLなど、「||」で文字列を連結できるケースもある。