如何对string_agg()的结果进行排序


98

我有一张桌子:

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。

Answers:



25

https://docs.microsoft.com/zh-cn/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一样。
曼戈

5
问题是关于string_agg。Postgres偶然地回答了他的问题,他最后提到了这个问题。这个问题对其他人也很有用。
学校名称

1
:如果这句法给你的语法错误,请检查您的兼容级别stackoverflow.com/questions/43611024/...
大先生

4
select string_agg(prod,' | ') FROM 
  (SELECT product as prod FROM tblproducts ORDER BY product )MAIN;

SQL字段


2
我遇到了与OP相同的问题,这种方法是我的第一个想法,但不幸的是,它不起作用(这使我来到了这里),而Igor却做到了。
chbrown '16

在我这方面,两种方法(Ilesh和Igor)都行得通。
斯蒂芬

2
错误的答案。它可能会起作用,但不能保证能起作用。
zyamys '18

关系数据库部分基于数学集,这反映在以下事实中:SQL的基本原理是行顺序不重要。即使您要ORDER BY在子查询中包括一个子句,该FROM子句也不一定会按顺序获取数据。如果这行得通,那就太幸运了。
曼戈

1

我在寻找相同的SQL SERVER解决方案,并在下面找到解决方案

SELECT string_agg(product, ' | ') WITHIN GROUP (ORDER BY product) FROM tblproducts
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.