||(字符串串联)(Transact-SQL)
适用于:Azure SQL 数据库
||
字符串表达式中的管道运算符将两个或多个字符或二进制字符串、列或字符串和列名称的组合连接到一个表达式(字符串运算符)。 例如,SELECT 'SQL ' || 'Server';
返回 SQL Server
。
语法
expression || expression
参数
expression
字符和二进制数据类型类别中任一数据类型的任何有效表达式,xml、json、image、ntext 或文本数据类型除外。 两个表达式必须具有相同的数据类型,或者其中一个表达式必须能够隐式转换为另一个表达式的数据类型。
返回类型
返回优先级最高的参数的数据类型。 有关详细信息,请参阅 数据类型优先级。
注解
如果字符串串联的结果超出 8,000 字节的限值,则结果将被截断。 但是,如果串联的字符串中至少有一个是较大的值类型,则不会发生截断。
零长度字符串和字符
||
(字符串串联)运算符在处理空字符串、零长度字符串时的行为方式与处理NULL
值或未知值时的行为不同。 长度为零的字符串可以指定为两个引号,引号内没有任何字符。 可以将零长度二进制字符串指定为 0x
没有十六进制常量中指定的任何字节值。 串联长度为零的字符串始终要串联上述两个指定的字符串。
NULL 值的串联
与对 NULL
值执行的算术运算一样,将值添加到已知值时 NULL
,结果通常是一个 NULL
值。 使用 NULL
值执行的字符串串联操作也应生成结果 NULL
。
运算符||
不遵循该SET CONCAT_NULL_YIELDS_NULL
选项,并且总是像启用 ANSI SQL 行为一样的行为,如果任一输入是NULL
,则NULL
产生。 这是连接运算符与||
串联运算符之间+
行为的主要差异。 有关详细信息,请参阅 SET CONCAT_NULL_YIELDS_NULL。
必要时使用 CAST 和 CONVERT
在二进制字符串之间串联二进制字符串和任何字符串时,必须显式转换字符数据。
以下示例演示了何时 CONVERT
或 CAST
必须与二进制串联一起使用,以及 CONVERT
何时(或 CAST
)不必使用。
在此示例中,不需要函数 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
在此示例中,需要一个或CAST
一个CONVERT
函数,因为此示例连接两个二进制字符串和一个空格。
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
下创建一列,该列的姓氏(LastName
)后跟逗号、单个空格,然后创建该人员的名字(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 使用多个字符串串联
以下示例连接多个字符串以形成一个长字符串,以显示家族名称和 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. 在串联中使用大型字符串
以下示例将多个字符串串联成一个长字符串,然后尝试计算最终字符串的长度。 结果集的最终长度为 16,000,因为表达式计算从左侧开始,@x
+ @y
@z
+ 即 => (@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