दुर्भाग्य से, "इस एक कॉलम को छोड़कर सभी कॉलम" कहने के लिए SQL सिंटैक्स में कोई प्रावधान नहीं है । आप पंक्ति-प्रकार की अभिव्यक्ति में स्तंभों की शेष सूची को वर्तनी के द्वारा अपना लक्ष्य प्राप्त कर सकते हैं :
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;
यही कारण है कि अधिक स्पष्ट रूप के लिए कम है: । ROW
(b.col1, b.col2, b.col3)
हालाँकि, कॉलम नाम पंक्ति-प्रकार के भावों में संरक्षित नहीं हैं। आपको इस तरह से JSON ऑब्जेक्ट में सामान्य कुंजी नाम मिलते हैं। मुझे मूल कॉलम नामों को संरक्षित करने के लिए 3 विकल्प दिखाई देते हैं:
1. पंजीकृत प्रकार के लिए डाली
एक प्रसिद्ध (पंजीकृत) पंक्ति प्रकार के लिए कास्ट करें। प्रत्येक मौजूदा तालिका या दृश्य के लिए या एक स्पष्ट CREATE TYPE
विवरण के साथ एक प्रकार पंजीकृत है । आप एक तदर्थ समाधान (सत्र की अवधि के लिए जीवन) के लिए एक अस्थायी तालिका का उपयोग कर सकते हैं:
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. एक सबसिलेक्ट का उपयोग करें
एक व्युत्पन्न तालिका के निर्माण के लिए एक उप-विषयक का उपयोग करें और तालिका को संपूर्ण रूप में संदर्भित करें । यह स्तंभ नाम भी रखता है। यह अधिक क्रिया है, लेकिन आपको एक पंजीकृत प्रकार की आवश्यकता नहीं है:
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;
सम्बंधित:
के लिए इसी तरह jsonb
संबंधित कार्यों के साथ jsonb_agg()
और jsonb_build_object()
।
के लिए Postgres 9.5 या बाद में यह भी देखना a_horse का जवाब एक नया छोटा वाक्य रचना प्रकार के साथ: Postgres जोड़ा माइनस ऑपरेटर -
के लिएjsonb
कहने के लिए "यह एक कुंजी को छोड़ कर सभी चाबियाँ" ।
चूंकि Postgres 10 "कई कुंजियों को छोड़कर" एक ही ऑपरेटर के साथ कार्यान्वित किया जाता है जो text[]
कि 2 ऑपरेंड के रूप में लिया जाता है - जैसे कि mlt टिप्पणी।