Cách sắp xếp kết quả từ string_agg ()


98

Tôi có một bảng:

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

Với các hàng:

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');

Nếu tôi thực hiện string_agg()trên tblproducts:

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

Nó sẽ trả về kết quả sau:

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

Làm cách nào để sắp xếp chuỗi tổng hợp, theo thứ tự tôi sẽ sử dụng ORDER BY product?

Tôi đang sử dụng PostgreSQL 9.2.4.

Câu trả lời:


221

Với postgres 9.0+, bạn có thể viết:

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

Thông tin chi tiết tại đây .


bạn có thể vui lòng đề xuất một giải pháp mà cũng sẽ hoạt động khi sử dụng các chức năng cửa sổ?
Saurabh Gujarani

Cảm ơn các liên kết. Tìm kiếm string_aggtrong tài liệu không đưa bạn đến đó.
Manngo

25

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
Câu hỏi là về PostgreSQL. Các WITHIN GROUPđiều khoản không áp dụng cho các string_aggchức năng, vì nó làm với Microsoft SQL.
Manngo

5
Câu hỏi là về string_agg. Postgres tình cờ đến câu hỏi của anh ấy và anh ấy đã đề cập đến nó lần cuối. Câu hỏi cũng hữu ích cho những người khác.
nomen

1
Nếu cú ​​pháp này gây ra lỗi cú pháp cho bạn, hãy kiểm tra mức độ tương thích của bạn: stackoverflow.com/questions/43611024/…
Mr. TA

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

SQL FIDDLE


2
Tôi đã gặp vấn đề tương tự như OP, và cách tiếp cận này là suy nghĩ đầu tiên của tôi, nhưng tiếc là nó không hoạt động (điều đã đưa tôi đến đây), trong khi của Igor thì có.
chbrown

Về phía tôi, cả hai cách tiếp cận (của Ilesh và Igor) đều hoạt động.
Stephan

2
Câu trả lời sai. Nó có thể hoạt động nhưng không được đảm bảo hoạt động.
zyamys

Cơ sở dữ liệu quan hệ một phần dựa trên các tập toán học, và điều này được phản ánh trong thực tế là một nguyên tắc cơ bản trong SQL là thứ tự hàng không có ý nghĩa. Ngay cả khi bạn bao gồm một ORDER BYmệnh đề trong truy vấn phụ, FROMmệnh đề đó không nhất thiết phải lấy dữ liệu theo thứ tự. Nếu điều này hiệu quả, đó là một sự may mắn thuần túy.
Manngo

1

Tôi đang tìm kiếm giải pháp tương tự cho SQL SERVER và tìm thấy giải pháp bên dưới

SELECT string_agg(product, ' | ') WITHIN GROUP (ORDER BY product) FROM tblproducts
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.