Поделиться через


|| (Объединение строк) (Transact-SQL)

Применимо к: База данных SQL Azure

Оператор || каналов в строковом выражении объединяет два или более символьных или двоичных строк, столбцов или сочетание строк и имен столбцов в одно выражение (строковый оператор). Например, SELECT 'SQL ' || 'Server'; возвращает SQL Server.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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 при необходимости

При сцеплении двоичных строк с любыми символами между двоичными строками необходимо использовать явное преобразование в символьные данные.

В следующих примерах показано, когда CASTCONVERTнеобходимо использовать двоичное объединение, а также когда CONVERTCASTили , не нужно использовать.

В этом примере нет или CAST функция не CONVERT требуется, так как этот пример объединяет две двоичные строки.

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.

А. Использование объединения строк

В следующем примере создается один столбец под заголовком 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) усечен на 8000 байт, а затем @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