次の方法で共有


||(文字列連結)(Transact-SQL)

適用対象: Azure SQL Database

文字列式の || パイプ演算子は、2 つ以上の文字またはバイナリ文字列、列、または文字列と列名の組み合わせを 1 つの式 (文字列演算子) に連結します。 たとえば、SELECT 'SQL ' || 'Server'; では SQL Server が返されます。

Transact-SQL 構文表記規則

構文

expression || expression

引数

式 (expression)

xmljsonimagentext、またはtextデータ型を除く、文字データ型とバイナリ データ型カテゴリのいずれかの有効な式。 両方の式は、同じデータ型でなければなりません。または、一方の式をもう一方の式のデータ型に暗黙的に変換できる必要があります。

戻り値の型

優先順位が最も高い引数のデータ型を返します。 詳細については、「 Data 型の優先順位」を参照してください。

解説

文字列の連結の結果が 8,000 バイトを超える場合、結果は切り捨てられます。 ただし、連結された文字列の少なくとも 1 つが大きな値型の場合、切り捨ては行われません。

長さ 0 の文字列と文字

|| (文字列連結) 演算子は、空の長さ 0 の文字列で動作する場合と、NULLまたは不明な値で動作する場合とは動作が異なります。 長さがゼロの文字列は、間に文字を挟まない 2 つの単一引用符で指定できます。 長さ 0 のバイナリ文字列は、16 進定数にバイト値を指定せずに、 0x として指定できます。 長さがゼロの文字列の連結では、常に 2 つの指定された文字列を連結します。

NULL 値の連結

NULL値に対して実行される算術演算と同様に、NULL値が既知の値に追加されると、通常、結果はNULL値になります。 NULL値で実行される文字列連結操作でも、NULL結果が生成されます。

||演算子は、SET CONCAT_NULL_YIELDS_NULL オプションを受け入れず、ANSI SQL の動作が有効になっているかのように常に動作し、入力のいずれかがNULLされた場合に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 つの列を作成し、そのユーザーのファミリ名 (LastName) の後にコンマ、1 つのスペース、ユーザーの名 (FirstName) を付けます。 結果セットは、ファミリ名の昇順、アルファベット順、名順になります。

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