+ (文字列連結) (Transact-SQL)
Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス
文字列式の中の演算子であり、2 つ以上の文字列やバイナリ文字列、列、文字列と列名の組み合わせを 1 つの式に連結します (文字列演算子)。 SELECT 'book'+'case';
の例では、bookcase
が返されます。
構文
expression + expression
引数
式 (expression)
image、ntext、または text データ型を除く、文字データ型とバイナリ データ型カテゴリのいずれかの有効な式。 両方の式は、同じデータ型でなければなりません。または、一方の式をもう一方の式のデータ型に暗黙的に変換できる必要があります。
戻り値の型
優先順位が最も高い引数のデータ型を返します。 詳細については、「 Data 型の優先順位」を参照してください。
解説
文字列の連結の結果が 8,000 バイトを超える場合、結果は切り捨てられます。 ただし、連結された文字列の少なくとも 1 つが大きな値型の場合、切り捨ては行われません。
長さ 0 の文字列と文字
+
文字列連結演算子は、空の長さ 0 の文字列で動作する場合と、NULL
または不明な値で動作する場合とは動作が異なります。 長さがゼロの文字列は、間に文字を挟まない 2 つの単一引用符で指定できます。 長さ 0 のバイナリ文字列は、16 進定数にバイト値を指定せずに、 0x
として指定できます。 長さがゼロの文字列の連結では、常に 2 つの指定された文字列を連結します。
NULL 値の連結
NULL
値を持つ文字列を操作する場合、連結の結果はセッション設定によって異なります。 NULL
値に対して実行される算術演算と同様に、NULL
値が既知の値に追加されると、結果は通常は不明な値になります。NULL
値を使用して実行される文字列連結操作でも、NULL
結果が生成されます。
ただし、現在のセッションの CONCAT_NULL_YIELDS_NULL
の設定を変更することにより、この動作を変更できます。 詳しくは、「SET CONCAT_NULL_YIELDS_NULL」をご覧ください。
必要に応じて CAST と CONVERT を使用する
2 つのバイナリ間にある任意の文字列を、その両端にあるバイナリ文字列と結合する場合、文字データへの明示的な変換を使用する必要があります。
次の例は、 CONVERT
または CAST
をバイナリ連結と共に使用する必要があり、 CONVERT
または CAST
を使用する必要がない場合を示しています。
この例では、2 つのバイナリ文字列を連結するため、 CONVERT
または CAST
関数は必要ありません。
DECLARE @mybin1 VARBINARY(5), @mybin2 VARBINARY(5);
SET @mybin1 = 0xFF;
SET @mybin2 = 0xA5;
-- No CONVERT or CAST function is required because this example
-- concatenates two binary strings.
SELECT @mybin1 + @mybin2;
この例では、2 つのバイナリ文字列とスペースを連結するため、 CONVERT
または CAST
関数が必要です。
DECLARE @mybin1 VARBINARY(5), @mybin2 VARBINARY(5);
SET @mybin1 = 0xFF;
SET @mybin2 = 0xA5;
-- A CONVERT or CAST function is required because this example
-- concatenates two binary strings plus a space.
SELECT CONVERT(VARCHAR(5), @mybin1) + ' '
+ CONVERT(VARCHAR(5), @mybin2);
-- Here is the same conversion using CAST.
SELECT CAST(@mybin1 AS VARCHAR(5)) + ' '
+ CAST(@mybin2 AS VARCHAR(5));
例
この記事の Transact-SQL コード サンプルは AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。
A. 文字列連結を使用する
次の例では、複数の文字列から Name
列見出しの下に 1 つの列を作成し、その後に、そのユーザーのファミリ名の後にコンマ、1 つのスペース、ユーザーの名を付けます。 結果セットは、ファミリ名の昇順、アルファベット順、名順になります。
SELECT (LastName + ', ' + FirstName) AS Name
FROM Person.Person
ORDER BY LastName ASC, FirstName ASC;
B. 数値データ型と日付データ型を結合する
次の例では、CONVERT
関数を使用して、numeric 型と date データ型を連結します。
SELECT 'The order is due on ' + CONVERT(VARCHAR(12), DueDate, 101)
FROM Sales.SalesOrderHeader
WHERE SalesOrderID = 50001;
GO
結果セットは次のとおりです。
------------------------------------------------
The order is due on 04/23/2007
C: 複数の文字列連結を使用する
次の例では、複数の文字列を連結して 1 つの長い文字列を形成し、Adventure Works Cycles の副会長の最初の頭文字とファミリ名を表示します。 コンマは、ファミリ名の後に追加され、最初のイニシャルの後にピリオドが追加されます。
SELECT (LastName + ',' + SPACE(1) + SUBSTRING(FirstName, 1, 1) + '.') AS Name, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle LIKE 'Vice%'
ORDER BY LastName ASC;
GO
結果セットは次のとおりです。
Name Title
------------- ---------------`
Duffy, T. Vice President of Engineering
Hamilton, J. Vice President of Production
Welcker, B. Vice President of Sales
D. 連結で大きな文字列を使用する
次の例では、複数の文字列を連結して 1 つの長い文字列を形成し、最終的な文字列の計算を試行します。 結果セットの最終的な長さは 16,000 です。式の評価は左から開始されます。つまり、 @x
+ @z
+ @y
=> (@x + @z
) + @y
。 この場合、(@x
+ @z
) の結果は 8,000 バイトで切り捨てられ、結果セットに @y
が追加され、最終的な文字列の長さが 16,000 になります。 @y
は大きな値型の文字列であるため、切り捨ては行われません。
DECLARE @x VARCHAR(8000) = REPLICATE('x', 8000)
DECLARE @y VARCHAR(max) = REPLICATE('y', 8000)
DECLARE @z VARCHAR(8000) = REPLICATE('z',8000)
SET @y = @x + @z + @y
-- The result of following select is 16000
SELECT LEN(@y) AS y
GO
結果セットは次のとおりです。
y
-------
16000
例: Azure Synapse Analytics、Analytics Platform System (PDW)
この記事の Transact-SQL コード サンプルは AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。
E. 複数の文字列連結を使用する
次の例では、複数の文字列を連結して 1 つの長い文字列を形成し、ファミリ名と、サンプル データベース内の副社長の最初のイニシャルを表示します。 コンマは、ファミリ名の後に追加され、最初のイニシャルの後にピリオドが追加されます。
SELECT (LastName + ', ' + SUBSTRING(FirstName, 1, 1) + '.') AS Name, Title
FROM DimEmployee
WHERE Title LIKE '%Vice Pres%'
ORDER BY LastName ASC;
結果セットは次のとおりです。
Name Title
------------- ---------------
Duffy, T. Vice President of Engineering
Hamilton, J. Vice President of Production
Welcker, B. Vice President of Sales