Как отсортировать результат от string_agg ()

101

У меня есть таблица:

CREATE TABLE tblproducts
(
productid integer,
product character varying(20)
)

С рядами:

INSERT INTO tblproducts(productid, product) VALUES (1, 'CANDID POWDER 50 GM');
INSERT INTO tblproducts(productid, product) VALUES (2, 'SINAREST P SYP 100 ML');
INSERT INTO tblproducts(productid, product) VALUES (3, 'ESOZ D 20 MG CAP');
INSERT INTO tblproducts(productid, product) VALUES (4, 'HHDERM CREAM 10 GM');
INSERT INTO tblproducts(productid, product) VALUES (5, 'CREAM 15 GM');
INSERT INTO tblproducts(productid, product) VALUES (6, 'KZ LOTION 50 ML');
INSERT INTO tblproducts(productid, product) VALUES (7, 'BUDECORT 200 Rotocap');

Если я исполняю string_agg()на tblproducts:

SELECT string_agg(product, ' | ') FROM "tblproducts"

Он вернет следующий результат:

CANDID POWDER 50 GM | ESOZ D 20 MG CAP | HHDERM CREAM 10 GM | CREAM 15 GM | KZ LOTION 50 ML | BUDECORT 200 Rotocap

Как мне отсортировать агрегированную строку в том порядке, в котором я буду ее использовать ORDER BY product?

Я использую PostgreSQL 9.2.4.

Вивек С.
источник

Ответы:

227

В postgres 9.0+ вы можете написать:

select string_agg(product,' | ' order by product) from "tblproducts"

Подробности здесь .

Игорь Романченко
источник
не могли бы вы предложить решение, которое также будет работать при использовании оконных функций?
Саураб Гуджарани
Спасибо за ссылку. Поиск string_aggв документации не приведет вас туда.
Manngo
32

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

SELECT
  STRING_AGG(prod, '|') WITHIN GROUP (ORDER BY product)
FROM ... 
Луук
источник
4
Вопрос был о PostgreSQL. Предложение WITHIN GROUPне применяется к string_aggфункции, как в случае с Microsoft SQL.
Manngo
7
Вопрос был о string_agg. Постгрес был второстепенным в своем вопросе и упомянул его последним. Вопрос полезен и для других.
номен
1
Если этот синтаксис вызывает синтаксические ошибки, проверьте свой уровень совместимости: stackoverflow.com/questions/43611024/…
Г-н Т.А.
4
select string_agg(prod,' | ') FROM 
  (SELECT product as prod FROM tblproducts ORDER BY product )MAIN;

SQL FIDDLE

Илеш Патель
источник
2
У меня была та же проблема, что и у OP, и этот подход был моей первой мыслью, но, к сожалению, он не работает (что привело меня сюда), в то время как Игорь работает.
chbrown
С моей стороны работали оба подхода (Илеша и Игоря).
Стефан
3
Неверный ответ. Это может сработать, но не обязательно.
zyamys
Реляционная база данных частично основана на математических наборах, и это отражено в том факте, что основной принцип в SQL состоит в том, что порядок строк не имеет значения. Даже если вы включили ORDER BYпредложение во вложенный запрос, FROMоно не обязательно содержит данные по порядку. Если это сработает, это чистая удача.
Manngo