String_agg () işlevinden sonuç nasıl sıralanır


101

Bir masam var:

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

Satırlar ile:

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

Ben yürütmek durumunda string_agg()üzerinde tblproducts:

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

Aşağıdaki sonucu döndürecektir:

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

Toplanan dizeyi kullanacağım sıraya göre nasıl sıralayabilirim ORDER BY product?

PostgreSQL 9.2.4 kullanıyorum.

Yanıtlar:


227

Postgres 9.0+ ile şunları yazabilirsiniz:

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

Detaylar burada .


pencere işlevlerini kullanırken de işe yarayacak bir çözüm önerebilir misiniz?
Saurabh Gujarani

Bağlantı için teşekkürler. string_aggBelgelerde arama yapmak sizi oraya götürmez.
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
Soru PostgreSQL hakkındaydı. Bu WITHIN GROUPyan tümce, string_aggMicrosoft SQL'de olduğu gibi işlev için geçerli değildir .
Manngo

7
Soru string_agg hakkındaydı. Postgres sorusuna tesadüfi oldu ve en son bundan bahsetti. Soru başkaları için de yararlıdır.
nomen

1
Bu sözdizimi size sözdizimi hataları veriyorsa, uyumluluk düzeyinizi kontrol edin: stackoverflow.com/questions/43611024/…
Bay TA

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

SQL FIDDLE


2
OP ile aynı sorunu yaşadım ve bu yaklaşım benim ilk düşüncemdi, ancak ne yazık ki işe yaramıyor (bu beni buraya getirdi), oysa Igor'unki.
chbrown

Benim tarafımda, her iki yaklaşım da (Ilesh'ler ve Igor'lar) işe yaradı.
Stephan

3
Yanlış cevap. İşe yarayabilir, ancak çalışması garanti edilmez.
zyamys

İlişkisel Veritabanı kısmen matematiksel kümelere dayanır ve bu, SQL'deki temel ilkenin satır sırasının önemli olmadığı gerçeğine yansımıştır. ORDER BYAlt sorguya bir cümle dahil etseniz bile , FROMcümle, verileri sırayla almayabilir. Bu işe yararsa, saf şanstır.
Manngo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.