วิธีจัดเรียงผลลัพธ์จาก 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"

รายละเอียดที่นี่ .


คุณช่วยแนะนำวิธีแก้ปัญหาที่สามารถใช้งานได้เมื่อใช้ฟังก์ชันหน้าต่างได้หรือไม่?
Saurabh Gujarani

ขอบคุณสำหรับลิงค์ การค้นหา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 Postgres เป็นเรื่องบังเอิญสำหรับคำถามของเขาและเขาพูดถึงมันเป็นครั้งสุดท้าย คำถามเป็นประโยชน์กับคนอื่น ๆ เช่นกัน
ชื่อ

1
หากไวยากรณ์นี้ทำให้คุณมีข้อผิดพลาดทางไวยากรณ์ให้ตรวจสอบระดับความเข้ากันได้ของคุณ: 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
ฉันมีปัญหาเดียวกันกับ OP และวิธีนี้เป็นความคิดแรกของฉัน แต่น่าเสียดายที่มันไม่ได้ผล (ซึ่งทำให้ฉันมาที่นี่) ในขณะที่อิกอร์ทำ
chbrown

ในด้านของฉันทั้งสองวิธี (ของ Ilesh และ Igor) ได้ผล
Stephan

3
คำตอบที่ไม่ถูกต้อง. อาจใช้งานได้ แต่ไม่รับประกันว่าจะใช้งานได้
zyamys

ฐานข้อมูลเชิงสัมพันธ์มีพื้นฐานมาจากชุดทางคณิตศาสตร์และสิ่งนี้สะท้อนให้เห็นในข้อเท็จจริงที่ว่าหลักการพื้นฐานใน SQL คือลำดับแถวไม่มีนัยสำคัญ แม้ว่าคุณจะรวมORDER BYอนุประโยคในแบบสอบถามย่อย แต่FROMประโยคนั้นไม่จำเป็นต้องได้รับข้อมูลตามลำดับ หากได้ผลก็เป็นความโชคดีอย่างแท้จริง
Manngo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.