皆さんが文字列の連結に用いるもので真っ先に思い描くのは何ですか?
まだ学習を始めて間もない方は恐らく「+(プラス)」を思い浮かべるのではないでしょうか?
勿論間違いではありませんが、連結演算子とは別に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関数を使用していると思います。
色々関数を覚えておくとこういった似たような作用をするクエリの構築も悩むことなく進められるので、出来るだけ多くの関数を知っておくことが必要ではないでしょうか。
これから学習を進めていく方にとっては沢山ありすぎると思われるかもしれませんが、実戦で使う関数というものは多く見積もっても参考書に載っている半分程度の為、頑張ればすぐに覚えることも出来ます。
まずはこの記事を見て連結に関する関数知識を培ってみてはいかがでしょうか?