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は、引数を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
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以外に文字列結合子などで文字列の連結が可能なものもある
SQLを学んでWebエンジニアを目指そう
Webエンジニアは、Webサービスを作るエンジニアで非常に人気の高い職種です。
スタートアップやベンチャー企業が中心なので柔軟性のある雇用形態、魅力的な作業環境、面白いプロジェクト、高い報酬など非常に魅力的な求人が多いです。
Ruby on RailsやGo言語を用いたプロジェクトが多く、SQLも重要なスキルとなります。
このブログを運営するプログラミングスクールのポテパンキャンプでは、実践的なカリキュラムと現役エンジニアからのレビュー、そしてポートフォリオ添削や模擬面談などの面談転職サポートにより、最短距離でWebエンジニアを目指すことができます。
Webエンジニアへの転職を考えている方は、是非一度無料カウンセリングへお申込みください。