Как отсортировать результат от 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.