CONCAT: примеры (SQL)

Функция CONCAT для объединения строк в SQL Server
Раздел: Строковые функции, Строковые
CONCAT(string_value1, string_value2 [, n]): string

Основные сведения о функции CONCAT

Функция CONCAT предназначена для объединения двух и более строковых значений в MS SQL Server. Впервые она была представлена в SQL Server 2012 (версия 11.x). Её использование упрощает сцепление строк по сравнению с оператором +, так как она автоматически преобразует нестроковые аргументы в строковый тип данных и обрабатывает значения NULL как пустые строки.

Функция принимает от 2 до 254 аргументов, которые могут быть любого типа данных. Аргументы неявно преобразуются в строковый тип, если это необходимо. Если все аргументы равны NULL, возвращается строка нулевой длины (типа varchar(1)). Возвращаемый тип данных зависит от типов аргументов: если любой аргумент имеет тип данных SQL-CLR или nvarchar(max), то результатом будет nvarchar(max); иначе, если любой аргумент имеет тип varchar(max), то результатом будет varchar(max). В других случаях результатом будет строковое значение типа, определяемого правилами очередности типов данных.

Базовые примеры использования

Объединение строковых литералов:

SELECT CONCAT('Привет', ', ', 'мир!') AS Result;
Result
------------
Привет, мир!

Работа с числами и датами (автоматическое преобразование):

SELECT CONCAT('Заказ №', 125, ' от ', GETDATE()) AS Result;
Result
--------------------------------------
Заказ №125 от Nov 15 2023 10:30AM

Обработка значений NULL:

SELECT CONCAT('Это', NULL, 'тест') AS Result;
Result
-------
Этетест

Использование с табличными данными:

SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Employees;

Альтернативные методы конкатенации в MS SQL

Оператор +: Традиционный метод сцепления строк. Требует явного преобразования типов данных и возвращает NULL, если любой операнд равен NULL (если не установлена настройка CONCAT_NULL_YIELDS_NULL).

Функция CONCAT_WS (доступна с SQL Server 2017): Объединяет строки с указанным разделителем. Первый аргумент — разделитель, последующие — значения для объединения. Игнорирует NULL, но добавляет разделитель между не-NULL значениями.

Функция FORMAT: Может использоваться для сложного форматирования, включая конкатенацию, но менее производительна для простого объединения строк.

Оператор + предпочтителен для простых сценариев без NULL, CONCAT — когда требуется автоматическое преобразование типов и обработка NULL, CONCAT_WS — для объединения с разделителем.

Типичные ошибки и предостережения

Превышение максимального количества аргументов:

-- Попытка передать более 254 аргументов вызовет ошибку
SELECT CONCAT(1,2,3,...,255);
Ошибка: The concat function requires 2 to 254 arguments.

Непредвиденные результаты при использовании с датами и специальными типами данных без явного форматирования:

SELECT CONCAT('Дата: ', CAST('2023-12-31' AS datetime)) AS Result;
Результат может зависеть от региональных настроек сервера.

Ошибочное предположение о поведении с разделителями (в отличие от CONCAT_WS):

-- CONCAT не добавляет пробелы автоматически
SELECT CONCAT('Иван', 'Иванов') AS FullName;
FullName
---------
ИванИванов

История изменений функции

Функция CONCAT была введена в SQL Server 2012. Значительных изменений в её синтаксисе или поведении в последующих версиях не было. Однако, начиная с SQL Server 2017, появилась функция CONCAT_WS, которая дополняет возможности CONCAT для сценариев с разделителями.

В SQL Server 2019 и выше, при использовании в режиме совместимости с более новыми версиями, могут быть незначительные оптимизации в плане выполнения запросов с CONCAT.

Расширенные и специализированные примеры

Динамическое построение SQL-запроса:

Пример sql
DECLARE @TableName NVARCHAR(128) = N'Employees';
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = CONCAT(N'SELECT * FROM ', QUOTENAME(@TableName), N' WHERE Active = 1');
-- PRINT @SQL;

Объединение строк из столбцов с условием:

Пример sql
SELECT CONCAT(
    FirstName,
    CASE WHEN MiddleName IS NOT NULL THEN CONCAT(' ', MiddleName) ELSE '' END,
    ' ',
    LastName
) AS FullName FROM Persons;

Использование в сочетании с STRING_AGG (SQL Server 2017+):

Пример sql
SELECT DepartmentID,
       CONCAT('Сотрудники: ', STRING_AGG(CONCAT(FirstName, ' ', LastName), ', ')) AS EmployeeList
FROM Employees
GROUP BY DepartmentID;

Создание строки с разделителями из нескольких столбцов без CONCAT_WS:

Пример sql
SELECT CONCAT(Column1, ',', Column2, ',', Column3) AS CSVLine FROM MyTable;

Объединение значений XML:

Пример sql
SELECT CONCAT('<root>', (SELECT * FROM Employees FOR XML PATH('')), '</root>') AS XMLData;

Рекурсивное построение пути:

Пример sql
WITH CTE AS (
    SELECT 1 AS Level, CONCAT('Level', 1) AS Path
    UNION ALL
    SELECT Level + 1, CONCAT(Path, ' -> ', 'Level', Level + 1)
    FROM CTE WHERE Level < 5
) SELECT * FROM CTE;

Функции конкатенации в других СУБД

MySQL: Имеет функцию CONCAT, которая также обрабатывает NULL как пустую строку. Есть CONCAT_WS.

SELECT CONCAT('Hello', NULL, 'World');
HelloWorld

Oracle: Использует оператор || или функцию CONCAT, но последняя принимает только два аргумента.

SELECT 'Hello' || ' ' || 'World' FROM dual;
Hello World

PostgreSQL: Использует оператор ||. Функция CONCAT игнорирует NULL.

SELECT CONCAT('Hello', NULL, 'World');
HelloWorld

SQLite: Использует оператор ||.

Sybase ASE: Использует оператор + и функцию CONCAT (с некоторыми отличиями в поведении с NULL).

MS SQL CONCAT function comments

En
CONCAT Returns a string that is the result of concatenating two or more string values