||(文字列連結)(Transact-SQL)
適用対象: Azure SQL Database
文字列式の ||
パイプ演算子は、2 つ以上の文字またはバイナリ文字列、列、または文字列と列名の組み合わせを 1 つの式 (文字列演算子) に連結します。 たとえば、SELECT 'SQL ' || 'Server';
では SQL Server
が返されます。
構文
expression || expression
引数
式 (expression)
xml、json、image、ntext、または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