Как отсортировать результат от 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.