Различные методы получения результатов SQL-запроса, разделенных запятыми

В SQL принято получать результаты запроса в формате, в котором значения разделены запятыми. Этот формат полезен в различных сценариях, таких как создание файлов со значениями, разделенными запятыми (CSV) или создание динамических запросов SQL. В этой статье мы рассмотрим несколько методов достижения этого результата с использованием различных диалектов SQL. Для лучшего понимания каждый метод будет сопровождаться примерами кода.

Метод 1: STRING_AGG (SQL Server)

SELECT STRING_AGG(column_name, ',') AS result
FROM table_name
WHERE condition;

Метод 2: GROUP_CONCAT (MySQL)

SELECT GROUP_CONCAT(column_name SEPARATOR ',') AS result
FROM table_name
WHERE condition;

Метод 3: LISTAGG (Oracle)

SELECT LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_name) AS result
FROM table_name
WHERE condition;

Метод 4: ARRAY_TO_STRING (PostgreSQL)

SELECT ARRAY_TO_STRING(ARRAY(SELECT column_name FROM table_name WHERE condition), ',') AS result;

Метод 5: WM_CONCAT (Oracle, устаревший)

SELECT WM_CONCAT(column_name) AS result
FROM table_name
WHERE condition;

Метод 6: рекурсивный CTE (SQL Server)

WITH cte AS (
    SELECT column_name, ROW_NUMBER() OVER (ORDER BY column_name) AS rn
    FROM table_name
    WHERE condition
)
SELECT result = (SELECT column_name + ',' FROM cte ORDER BY rn FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)');

Метод 7: пользовательская функция (универсальная)

CREATE FUNCTION dbo.ConcatenateColumnValues(@column_name AS VARCHAR(100), @separator AS VARCHAR(1))
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @result AS VARCHAR(MAX);
    SET @result = '';
    SELECT @result = @result + column_name + @separator
    FROM table_name
    WHERE condition;
    IF LEN(@result) > 0
        SET @result = LEFT(@result, LEN(@result) - 1);
    RETURN @result;
END;

Использование:

SELECT dbo.ConcatenateColumnValues(column_name, ',') AS result
FROM table_name
WHERE condition;

В этой статье мы рассмотрели несколько методов получения результатов SQL-запроса, разделенных запятыми. Выбор метода зависит от конкретной используемой системы базы данных. Используя эти методы, вы можете легко генерировать результаты, разделенные запятыми, для нужных вам приложений.