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


99

У мене є стіл:

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.

Відповіді:


225

У Postgres 9.0+ ви можете написати:

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

Деталі тут .


Ви можете запропонувати рішення, яке також буде працювати при використанні функцій вікна?
Саурабх Гуджарані

Дякую за посилання. Пошук string_aggу документації не приведе вас туди.
Маннго,

33

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 ... 

3
Питання було про PostgreSQL. WITHIN GROUPПункт не відноситься до string_aggфункції, як це робить з Microsoft SQL.
Маннго,

6
Питання було про 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

На моїй стороні спрацювали обидва підходи (підхід Ілеша та Ігоря).
Stephan

3
Неправильну відповідь. Це може спрацювати, але не гарантується.
zyamys

Реляційна база даних частково базується на математичних наборах, і це відображається в тому, що основним принципом в SQL є те, що порядок рядків не є значущим. Навіть якщо ви повинні були включити ORDER BYречення в підзапит, це FROMречення не обов'язково приводить дані в порядок. Якщо це працює, це чиста удача.
Маннго,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.