Ne yazık ki, SQL sözdiziminde söyleyecek bir hüküm yok "bu bir sütun dışındaki tüm sütunlar" . Bir satır türü ifadesinde kalan sütun listesini yazarak hedefinize ulaşabilirsiniz :
SELECT a.id, a.name
, json_agg((b.col1, b.col2, b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
Yani daha açık formda kısaltılmışı: . ROW
(b.col1, b.col2, b.col3)
Ancak, sütun adları satır türü ifadelerinde korunmaz. JSON nesnesinde genel anahtar adlarını bu şekilde alırsınız. Orijinal sütun adlarını korumak için 3 seçenek görüyorum:
1. Kayıtlı türe yayınla
İyi bilinen (kayıtlı) bir satır türüne yayınlayın. Bir tür, mevcut her tablo veya görünüm için veya açık bir şekilde kaydedilirCREATE TYPE
ifadeyle kaydedilir. Geçici bir çözüm için geçici bir tablo kullanabilirsiniz (oturum süresi boyunca geçerlidir):
CREATE TEMP TABLE x (col1 int, col2 text, col3 date); -- use adequate data types!
SELECT a.id, a.name
, json_agg((b.col1, b.col2, b.col3)::x) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
2. Bir alt seçim kullanın
Türetilmiş bir tablo oluşturmak ve tabloya bir bütün olarak başvurmak için bir alt seçim kullanın . Bu aynı zamanda sütun isimlerini de taşır. Daha ayrıntılı, ancak kayıtlı bir türe ihtiyacınız yok:
SELECT a.id, a.name
, json_agg((SELECT x FROM (SELECT b.col1, b.col2, b.col3) AS x)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
SELECT a.id, a.name
, json_agg(json_build_object('col1', b.col1, 'col2', b.col2, 'col3', b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
İlişkili:
jsonb
İlgili işlevlerle benzer jsonb_agg()
vejsonb_build_object()
.
İçin Postgres 9.5 ayrıca bkz veya daha sonra a_horse cevabını yeni kısa sözdizimi varyantı ile: Postgres eklendi eksi operatörü -
içinjsonb
söylenecek "bu bir tuşu dışındaki tüm tuşlar" .
Yana Postgres 10 "birkaç tuşları dışında" aynı operatör alma ile uygulanan text[]
2 işlenen olarak - mlt yorumladı gibi.