24

Как конкатенировать текст из нескольких строк в одну строку в SQL Server

10

Проблема: У меня есть таблица в базе данных, в которой хранится список имен, состоящая из трех строк:

Peter
Paul
Mary

Мне нужно преобразовать эти имена в одну строку в формате Peter, Paul, Mary. Есть ли простой способ сделать это?

5 ответ(ов)

4

Метод, который еще не был показан с помощью команды XML data() в SQL Server, заключается в следующем:

Предположим, у нас есть таблица под названием NameList с одним столбцом FName:

SELECT FName + ', ' AS 'data()'
FROM NameList
FOR XML PATH('')

Этот запрос вернет:

"Peter, Paul, Mary, "

Как видно, в конце строки остальная запятая, и с ней нужно как-то справиться.

Как предлагалось в комментарии @NReilingh, можно использовать следующий метод, чтобы удалить конечную запятую. Предполагая те же имена таблицы и столбца:

STUFF(REPLACE((SELECT '#!' + LTRIM(RTRIM(FName)) AS 'data()' FROM NameList
FOR XML PATH('')),' #!',', '), 1, 2, '') as Brands

В этом варианте применяется функция REPLACE, чтобы заменить специальный префикс на запятую и пробел, а затем STUFF используется для удаления начальных двух символов. В результате мы получаем строку без лишней запятой в конце.

0

Вопрос: Как я могу объединить строки из таблицы в один строковый массив в PostgreSQL?

Ответ: PostgreSQL предоставляет мощные средства для работы с массивами и агрегацией данных. Вот пример, который поможет вам создать тестовые данные и агрегировать их в массив.

Сначала создадим таблицу и добавим в неё некоторые имена:

postgres=# \c test
You are now connected to database "test" as user "hgimenez".
test=# create table names (name text);
CREATE TABLE
test=# insert into names (name) values ('Peter'), ('Paul'), ('Mary');
INSERT 0 3
test=# select * from names;
 name
-------
 Peter
 Paul
 Mary
(3 rows)

Теперь мы можем использовать функцию array_agg для агрегации имён в массив:

test=# select array_agg(name) from names;
 array_agg
-------------------
 {Peter,Paul,Mary}
(1 row)

Если вы хотите преобразовать массив в строку с разделением запятыми, вы можете использовать функцию array_to_string:

test=# select array_to_string(array_agg(name), ', ') from names;
 array_to_string
-------------------
 Peter, Paul, Mary
(1 row)

С версии PostgreSQL 9.0 это стало ещё проще, вы можете использовать функцию string_agg, чтобы объединять строки напрямую:

select string_agg(name, ',') 
from names;

Таким образом, вы получили имена, объединённые в единую строку, пригодную для дальнейшего использования!

0

В SQL Server 2005 и более поздних версиях вы можете использовать следующий запрос для конкатенации строк:

DECLARE @t table
(
    Id int,
    Name varchar(10)
)
INSERT INTO @t
SELECT 1,'a' UNION ALL
SELECT 1,'b' UNION ALL
SELECT 2,'c' UNION ALL
SELECT 2,'d' 

SELECT ID,
stuff(
(
    SELECT ',' + [Name] FROM @t WHERE Id = t.Id FOR XML PATH('')
), 1, 1, '') AS ConcatenatedNames
FROM (SELECT DISTINCT Id FROM @t) t

Этот запрос создаёт временную таблицу и заполняет её данными. Затем с помощью подзапроса и функции STUFF вы можете конкатенировать имена, относящиеся к одному и тому же идентификатору. Функция FOR XML PATH('') позволяет объединять строки в одну, а STUFF используется для удаления начальной запятой. В итоге вы получите список идентификаторов с соответствующими им конкатенированными значениями из столбца Name.

0

Я не имею доступа к SQL Server дома, поэтому предполагаю, что синтаксис должен выглядеть примерно так:

DECLARE @names VARCHAR(500) = ''

SELECT @names = @names + ' ' + Name
FROM Names

Однако, стоит отметить, что такой подход может вызвать проблемы с производительностью, особенно если в таблице Names много записей. При этом, если вы собираетесь обрабатывать длинные строки, лучше использовать тип данных VARCHAR(MAX) или NVARCHAR(MAX). Рассмотрите также возможность использования функции STRING_AGG() (начиная с SQL Server 2017) для более эффективного объединения строк:

SELECT @names = STRING_AGG(Name, ' ')
FROM Names

Это значительно упростит код и улучшит его читаемость!

0

Вам необходимо создать переменную, которая будет хранить ваш финальный результат, и использовать оператор SELECT для ее заполнения следующим образом.

Простое решение

DECLARE @char VARCHAR(MAX);

SELECT @char = COALESCE(@char + ', ' + [column], [column]) 
FROM [table];

PRINT @char;

В этом коде мы сначала объявляем переменную @char типа VARCHAR(MAX), а затем в SELECT используем функцию COALESCE, чтобы сконкатенировать значения из указанного столбца [column], разделяя их запятой. В конце выводим результат с помощью команды PRINT.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь