9.4 বা আরও নতুন পোস্টগ্রেস
স্পষ্টতই এই পোস্টটি দ্বারা অনুপ্রাণিত , Postgres 9.4 অনুপস্থিত ফাংশন (গুলি) যুক্ত করেছে:
প্যাচের জন্য লরেন্স রো এবং অ্যান্ড্রু ডানস্তানকে প্রতিশ্রুতিবদ্ধ করার জন্য ধন্যবাদ!
জেএসওন অ্যারে আনইস্ট করা। তারপরে এটি থেকে পোস্টগ্রিস অ্যারে তৈরি করতে array_agg()
বা কোনও এআরএই নির্মাণকারী ব্যবহার করুন । বা একটি স্ট্রিং তৈরি করতে ।string_agg()
text
একটি LATERAL
বা সম্পর্কযুক্ত সাবকোয়রিতে প্রতি সারিতে সামগ্রিক নিরীক্ষণ করা উপাদান । তারপরে মূল ক্রম সংরক্ষণ করা আছে এবং আমাদের প্রয়োজন নেই ORDER BY
, GROUP BY
এমনকি বাইরের ক্যোয়ারিতে একটি অনন্য কীও নেই। দেখা:
jsonb
নিম্নলিখিত সমস্ত এসকিউএল কোডের জন্য 'জসন' এর সাথে 'জসনব' প্রতিস্থাপন করুন ।
SELECT t.tbl_id, d.list
FROM tbl t
CROSS JOIN LATERAL (
SELECT string_agg(d.elem::text, ', ') AS list
FROM json_array_elements_text(t.data->'tags') AS d(elem)
) d;
সংক্ষিপ্ত বাক্য গঠন:
SELECT t.tbl_id, d.list
FROM tbl t, LATERAL (
SELECT string_agg(value::text, ', ') AS list
FROM json_array_elements_text(t.data->'tags') -- col name default: "value"
) d;
সম্পর্কিত:
সম্পর্কযুক্ত subquery এ আররে নির্মাণকারক:
SELECT tbl_id, ARRAY(SELECT json_array_elements_text(t.data->'tags')) AS txt_arr
FROM tbl t;
সম্পর্কিত:
সূক্ষ্ম পার্থক্য : null
উপাদানগুলি প্রকৃত অ্যারেগুলিতে সংরক্ষিত থাকে । উপরের প্রশ্নগুলিতে একটি text
স্ট্রিং উত্পাদন করা সম্ভব নয়, এতে null
মান থাকতে পারে না । সত্য উপস্থাপনা একটি অ্যারে।
ফাংশন মোড়ক
বারবার ব্যবহারের জন্য, এটিকে আরও সহজ করে তোলার জন্য, কোনও ক্রিয়ায় যুক্তিকে আবদ্ধ করুন:
CREATE OR REPLACE FUNCTION json_arr2text_arr(_js json)
RETURNS text[] LANGUAGE sql IMMUTABLE AS
'SELECT ARRAY(SELECT json_array_elements_text(_js))';
এটি একটি এসকিউএল ফাংশন করুন , যাতে এটি আরও বড় ক্যোয়ারিতে ইনলাইন করা যায়। বড় প্রশ্নগুলিতে পুনরাবৃত্তি মূল্যায়ন এড়াতে এবং সূচক এক্সপ্রেশনগুলিতে এটির অনুমতি দেওয়ার জন্য এটি
তৈরি করুন IMMUTABLE
(কারণ এটি।
কল করুন:
SELECT tbl_id, json_arr2text_arr(data->'tags')
FROM tbl;
ডিবি <> ফিডল এখানে
9.3 বা তার বেশি বয়সীদের পোস্টগ্র্যাগ করে
ফাংশনটি ব্যবহার করুন json_array_elements()
। তবে আমরা এটি থেকে ডাবল উদ্ধৃত স্ট্রিংগুলি পাই ।
বহির্মুখী ক্যোয়ারিতে সমষ্টি সহ বিকল্প জিজ্ঞাসা। CROSS JOIN
নিখোঁজ বা খালি অ্যারে সহ সারিগুলি সরিয়ে দেয়। প্রক্রিয়াজাতকরণ উপাদানগুলির জন্যও কার্যকর হতে পারে। আমাদের একত্রিত করার জন্য একটি অনন্য কী প্রয়োজন:
SELECT t.tbl_id, string_agg(d.elem::text, ', ') AS list
FROM tbl t
CROSS JOIN LATERAL json_array_elements(t.data->'tags') AS d(elem)
GROUP BY t.tbl_id;
ARRAY নির্মাতা, এখনও উদ্ধৃত স্ট্রিং সহ:
SELECT tbl_id, ARRAY(SELECT json_array_elements(t.data->'tags')) AS quoted_txt_arr
FROM tbl t;
নোট যে null
উপরে উল্লিখিত নয়, টেক্সট মান "নাল" রূপান্তরিত হয়। ভুল, কঠোরভাবে কথা বলা এবং সম্ভাব্য অস্পষ্ট
দরিদ্র ব্যক্তির সাথে উদ্বিগ্ন trim()
:
SELECT t.tbl_id, string_agg(trim(d.elem::text, '"'), ', ') AS list
FROM tbl t, json_array_elements(t.data->'tags') d(elem)
GROUP BY 1;
টিবিএল থেকে একটি একক সারি পুনরুদ্ধার করুন:
SELECT string_agg(trim(d.elem::text, '"'), ', ') AS list
FROM tbl t, json_array_elements(t.data->'tags') d(elem)
WHERE t.tbl_id = 1;
স্ট্রিংগুলি সহ সম্পর্কিত সাবকোয়ারি ফর্মগুলি:
SELECT tbl_id, (SELECT string_agg(trim(value::text, '"'), ', ')
FROM json_array_elements(t.data->'tags')) AS list
FROM tbl t;
অ্যারে নির্মাণকারী:
SELECT tbl_id, ARRAY(SELECT trim(value::text, '"')
FROM json_array_elements(t.data->'tags')) AS txt_arr
FROM tbl t;
আসল (পুরানো) এসকিউএল ফিডল ।
ডিবি <> ফিডল এখানে।
সম্পর্কিত:
নোটস (পৃষ্ঠা 9.4 এর পরে পুরানো)
JSON অ্যারে থেকে যথাযথ মানগুলি ফিরিয়ে json_array_elements_text(json)
আনতে আমাদের দুটি, দুটিয়ের দরকার হবে । তবে মনে হচ্ছে এটি জেএসএন কার্যাদি সরবরাহিত অস্ত্রাগার থেকে অনুপস্থিত । বা স্কেলারের মান থেকে কোনও মান বের করতে অন্য কোনও ফাংশন । আমিও সেটিকে মিস করছি বলে মনে হচ্ছে।
তাই আমি ইম্প্রোমাইজ করেছি , তবে তা তুচ্ছ-মামুলির ক্ষেত্রে ব্যর্থ হবে ...json_array_elements(json)
text
text
JSON
trim()
json_extract_path_text(your_column, 'tags')
কি খুঁজছেন?