バナー画像

SQLの文字列結合についてまとめています。

SQLの文字列結合はconcat

SQLで文字列を結合するにはconcat関数を使います。以下は、concatでemp_no(社員番号)、’:’、first_name(姓名の名)、空白、last_name(姓名の姓)を結合した例です。

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はCONCATENATE(連結)の略 区切り文字指定にはconcat_wsを使用 

Oracleの文字列結合

OracleのCONCAT関数の構文は以下の通りです。

CONCAT(char1, char2)

関連)Oracle公式ドキュメント:CONCAT

OracleのCONCATは、引数を2つしか指定することができません。そのため、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には文字列結合子「||」があるので、2つ以上の値の結合はこちらのほうが使い勝手がよく、コードも見やすいです。

INSERT INTO tab1 (col1,  col2,     col3,     col4)
          VALUES ('abc', 'def   ', 'ghi   ', 'jkl');

SELECT col1 || col2 || col3 || col4 "Concatenation"
  FROM tab1;

Concatenation
------------------------
abcdef   ghi   jkl

参考)Oracle公式ドキュメント:連結演算子

SQL Serverの文字列結合

SQL Serverの文字列結合は、CONCAT関数で構文は以下の通り。

CONCAT ( string_value1, string_value2 [, string_valueN ] )  

SQL Serverでは、CONCATの引数は2個以上254個未満の指定が可能です。

参考)CONCAT (Transact-SQL) – SQL Server | Microsoft Docs

以下は、5つの値を連結した例です。数値は暗黙的に文字列に変換します。

SELECT CONCAT ( 'Happy ', 'Birthday ', 11, '/', '25' ) AS Result;  

Result  
-------------------------  
Happy Birthday 11/25  
  
(1 row(s) affected)  

また、SQL Serverでは、NULL値をからの文字列に暗黙的に変換します。連結対象の文字列の一つにNULLが含まれていた場合、NULLは無視されます。

CREATE TABLE #temp (  
    emp_name NVARCHAR(200) NOT NULL,  
    emp_middlename NVARCHAR(200) NULL,  
    emp_lastname NVARCHAR(200) NOT NULL  
);  
INSERT INTO #temp VALUES( 'Name', NULL, 'Lastname' );  
SELECT CONCAT( emp_name, emp_middlename, emp_lastname ) AS Result  
FROM #temp;  

Result  
------------------  
NameLastname  
  
(1 row(s) affected)  

SQL Serverには区切り文字指定が可能な文字列連結関数CONCAT_WSが用意されています。

CONCAT_WS ( separator, argument1, argument2 [, argumentN]... )

参考)CONCAT_WS (Transact-SQL) – SQL Server | Microsoft Docs

以下は、区切り文字として、’ – ‘を指定した例です。

SELECT CONCAT_WS( ' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo
FROM sys.databases;

------------------
1 - SIMPLE - NONE
2 - SIMPLE - NONE
3 - FULL - NONE
4 - SIMPLE - NONE

連結対象の文字列がNULLの場合はスキップ(無視)されます。

SELECT CONCAT_WS(',','1 Microsoft Way', NULL, NULL, 'Redmond', 'WA', 98052) AS Address;

Address
------------   
1 Microsoft Way,Redmond,WA,98052

MySQLの文字列結合

MySQLの文字列連結関数CONCATの構文は以下の通りです。

CONCAT(str1,str2,...)

参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5 文字列関数

MySQLでは連結対象の文字列に一つでもNULLが含まれていた場合、CONCATの返り値はNULLになります。

mysql> SELECT CONCAT('My', 'S', 'QL');
        -> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
        -> NULL
mysql> SELECT CONCAT(14.3);
        -> '14.3'

また、MySQLでは、文字列を空白で区切って記述すると連結する機能があります。

mysql> SELECT 'My' 'S' 'QL';
        -> 'MySQL'

CONCAT_WSは、区切り文字を指定して文字列の連結を行います。

CONCAT_WS(separator,str1,str2,...)

連結対象の文字列にNULLが含まれていた場合、処理がスキップされます。ただし、区切り文字(第一引数のseparator)がNULLの場合、結果は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'

PostgreSQLの文字列結合

PostgreSQLの文字列結合関数のconcatの構文は以下の通りです。

concat(str "any" [, str "any" [, ...] ])

PostgreSQLでは、連結対象の文字列にNULLが含まれていた場合は無視します。

select concat('abcde', 2, NULL, 22);

--------
abcde222

区切り文字を指定して文字列を結合する関数concat_wsの構文は以下の通りです。

concat_ws(sep text, str "any" [, str "any" [, ...] ])

NULLは無視されます。

concat_ws(',', 'abcde', 2, NULL, 22)	

----------
abcde,2,22

まとめ

ポテパンダの一言メモ
  • SQLで文字列を結合するにはconcat関数を使用する
  • concat関数は指定できる引数の数やNULLの扱いなど、DBMSによって仕様が異なる
  • DBMSによっては、concat以外に文字列結合子などで文字列の連結が可能なものもある

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

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

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

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

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

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

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

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

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

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

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