Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

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

参考)OracleのCONCAT

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

参考)PostgreSQLの文字列関数と演算子

値が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など、「||」で文字列を連結できるケースもある。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。