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

皆さんが文字列の連結に用いるもので真っ先に思い描くのは何ですか?

まだ学習を始めて間もない方は恐らく「+(プラス)」を思い浮かべるのではないでしょうか?

勿論間違いではありませんが、連結演算子とは別にCONCAT関数というものもあります。

そこで今回は学習段階があまり進んでいない方のために、「連結についてのあれこれ」について解説してみたいと思います。

連結演算子

連結演算子とはその名の通り、文字列を連結させるために使用される演算子を指します。

ここでは「+(プラス)」が連結演算子ということです。

勿論文字列だけでなく、同じデータ型なら問題なく使用できますが、数値と数値を連結演算子で連結させようとすると、数の和が出力されるので挙動を全て把握しましょう。

次のコードは、連結演算子を用いた場合の各データ型の挙動一覧となります。

// 文字列同士を連結演算子で繋ぐ
SELECT 'あいう' + 'えお'
GO
----------
あいうえお

// 数値同士を連結演算子で繋ぐ
SELECT 123 + 456
GO
----------
       579

// エラーとなる例
SELECT N'あいう' + 456
GO
メッセージ 245、レベル 16、状態 1、サーバー DESKTOP-T3J7G2K\SQLEXPRESS、行 1
nvarchar の値 'あいう' をデータ型 int に変換できませんでした。

異なるデータ型を連結させる

例えばデータ型が”int”のものとデータ型が”numeric”という異なるデータ型を連結させるためには「CONVERT関数」を使用します。

CONVERT関数の基本的な記述ルールは次の通りです。

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

“data_type”にはintやvarcharを指定、expressionには任意の有効な式(文字列や数値、日付型など)、styleにはexpressionを変換する方法を指定する整数式が入ります。

expressionがdateまたはtimeデータ型の場合、styleを使用することになりますが、日付及び時刻のスタイルに記載されているリストのうちいずれかの値を指定できます。

それでは実際にどのように記述することになるのかを見てみましょう。

※今回はサンプルに「AdventureWorksLT2019(軽量版)」を使用してコードを記述しています。

USE AdventureWorksLT2019

SELECT
	'The order is due on ' + CONVERT(varchar(12), DueDate, 111)  
FROM
	SalesLT.SalesOrderHeader
WHERE
	SalesOrderID = 71776;  
GO
--------------------------------
The order is due on 2008/06/13

CONCAT関数

CONCAT関数は複数の文字列を連結する関数です。

まずは記述から見ていきましょう。

CONCAT ( string_value1, string_value2 [, string_valueN ] )

この関数は、引数として割り当てられた文字列を取得し、一つの文字列に連結(または結合)します。

よって、引数は最小で2つ以上必要となります。

これより少ない引数を指定した場合にはエラーが返ってきます。

またCONCATは連結する前に全ての引数を文字列型に変換します。

これは言い換えると、引数に数値を指定した場合、その数値が文字列に変換されたのちに連結されるということです。

では実際にCONCAT関数についてサンプルコードで挙動を確認してみましょう。

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

Result  
-------------------------
Happy Birthday 11/25

NULLの挙動について

SQL Serverでは文字列が「NULL」の場合、連結演算子「+(プラス)」を使って文字列を連結させるとNULLになります。

サンプルとして次のコードを見てみましょう。

// NULLを挟まない連結式
SELECT N'12345' + N'67890'
GO
----------- 
1234567890

// NULLがある場合の連結式
SELECT N'12345' + NULL + N'67890'
GO
-----------
NULL

連結演算子「+(プラス)」を使用した場合には、このようにどこかに「NULL」があると結果が全て”NULL”になる事が確認できます。

これを解決するには「ISNULL」を使用する必要があります。

早速同じコードでISNULLを使ってみましょう。

// ISNULLを使ってNULLを挟んだ場合の連結式
SELECT N'12345' + ISNULL(NULL, '') + N'67890'
GO
-----------
1234567890

NULL部分をISNULLで囲んで代入した場合、きちんと「1234567890」が表示されていることが確認できました。

但し、今回のテーマである「CONCAT」を使用した場合にはこの限りではありません。

// CONCAT中にNULLがある場合
SELECT CONCAT(12345, NULL, 67890)
GO
----------
1234567890

CONCAT関数を使った場合NULLはnvarchar(1)の空文字に変換されるため、NULLを気にする必要がなくなります。

結果を見ても、CONCATにNULLが入っているにも拘らず、きちんと文字列として連結されていることが確認できました。

まとめ

いかがでしたか?

今回は連結についてどのような方法があるのか、またそれらの方法はどのような形で使えるのかについて解説してみました。

結果として、文字列に対しては連結演算子よりもCONCAT関数の方が使い勝手が良いため、ほとんどの人はCONCAT関数を使用していると思います。

色々関数を覚えておくとこういった似たような作用をするクエリの構築も悩むことなく進められるので、出来るだけ多くの関数を知っておくことが必要ではないでしょうか。

これから学習を進めていく方にとっては沢山ありすぎると思われるかもしれませんが、実戦で使う関数というものは多く見積もっても参考書に載っている半分程度の為、頑張ればすぐに覚えることも出来ます。

まずはこの記事を見て連結に関する関数知識を培ってみてはいかがでしょうか?

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

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

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

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

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

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

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

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

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

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

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