দুর্ভাগ্যক্রমে, এসকিউএল সিন্টেক্সে "এই এক কলাম ব্যতীত সমস্ত কলাম" বলার বিধান নেই । সারি ধরণের এক্সপ্রেশনটিতে থাকা কলামগুলির অবশিষ্ট তালিকাটি বানান করে আপনি আপনার লক্ষ্য অর্জন করতে পারেন :
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;
২. একটি সাবলেট ব্যবহার করুন
উদ্ভূত টেবিলটি তৈরি করতে একটি সাবলেট ব্যবহার করুন এবং পুরো টেবিলটি রেফারেন্স করুন । এটিতে কলামের নামও রয়েছে। এটি আরও ভার্বোজ, তবে আপনার নিবন্ধিত প্রকারের দরকার নেই:
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
বলতে "এই একটা চাবি ছাড়া সমস্ত চাবি" ।
যেহেতু পোস্টগ্র্রেস 10 "বেশ কয়েকটি কী বাদে" একই অপারেটরের সাথে text[]
দ্বিতীয় অপারেন্ড হিসাবে গ্রহণ হিসাবে প্রয়োগ করা হয় - যেমন মল্ট মন্তব্য করেছে।