JSON প্রকারের মধ্যে অ্যারের উপাদানগুলির জন্য অনুসন্ধান ery


118

আমি jsonPostgreSQL 9.3 এ টাইপটি পরীক্ষা করার চেষ্টা করছি ।
আমার কাছে একটি jsonকলাম কল করা আছে যা dataবলা আছে reports। জেএসওএন এর মতো কিছু দেখায়:

{
  "objects": [
    {"src":"foo.png"},
    {"src":"bar.png"}
  ],
  "background":"background.png"
}

আমি সমস্ত প্রতিবেদনের জন্য টেবিলটি জিজ্ঞাসা করতে চাই যা 'অবজেক্ট' অ্যারেতে 'src' মানটির সাথে মেলে। উদাহরণস্বরূপ, মেলে এমন সমস্ত রিপোর্টের জন্য কি ডিবিকে জিজ্ঞাসা করা সম্ভব 'src' = 'foo.png'? আমি সফলভাবে একটি ক্যোয়ারী লিখেছি যা এর সাথে মেলে "background":

SELECT data AS data FROM reports where data->>'background' = 'background.png'

তবে যেহেতু "objects"মানগুলির একটি অ্যারে রয়েছে তাই আমি এমন কিছু লিখতে পারি না যা কাজ করে। মেলে এমন সমস্ত প্রতিবেদনের জন্য কি ডিবিকে জিজ্ঞাসা করা সম্ভব 'src' = 'foo.png'? আমি এই উত্সগুলি দেখেছি কিন্তু এখনও এটি পেতে পারি না:

আমি এ জাতীয় জিনিস চেষ্টা করেও লাভ করি নি:

SELECT json_array_elements(data->'objects') AS data from reports
WHERE  data->>'src' = 'foo.png';

আমি কোনও এসকিউএল বিশেষজ্ঞ নই, তাই আমি কী ভুল করছি তা আমি জানি না।

উত্তর:


214

json পোস্টগ্রিস 9.3+ এ

অনুচ্ছেদে JSON অ্যারেটি json_array_elements()একটি পার্শ্বীয় ফাংশনের সাথে ক্লজটিতে যোগ দিন এবং FROMএর উপাদানগুলির জন্য পরীক্ষা করুন:

WITH reports(data) AS (
   VALUES ('{"objects":[{"src":"foo.png"}, {"src":"bar.png"}]
           , "background":"background.png"}'::json)
   ) 
SELECT *
FROM   reports r, json_array_elements(r.data#>'{objects}') obj
WHERE  obj->>'src' = 'foo.png';

কোটে ( WITHকোয়েরি) শুধু একটা টেবিল বদলে reports
বা, কেবলমাত্র একক স্তরের নেস্টিংয়ের সমতুল্য :

SELECT *
FROM   reports r, json_array_elements(r.data->'objects') obj
WHERE  obj->>'src' = 'foo.png';

->>, ->এবং #>অপারেটরগুলি ম্যানুয়ালটিতে ব্যাখ্যা করা হয়েছে।

উভয় প্রশ্নেরই অন্তর্নিহিত ব্যবহার করে JOIN LATERAL

এসকিউএল ফিডল।

ঘনিষ্ঠভাবে সম্পর্কিত উত্তর:

jsonb পোস্টগ্রিস 9.4+ এ

সমতুল্য ব্যবহার করুন jsonb_array_elements()

আরও ভাল , নতুন "ধারণাগুলি" অপারেটরটি ব্যবহার করুন @>(এক্সপ্রেশনটিতে একটি জিন জিআইএন সূচকের সাথে সেরা data->'objects'):

CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);

SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';

যেহেতু কীটি objectsএকটি জেএসওন অ্যারে ধারণ করেছে , তাই আমাদের অনুসন্ধান শব্দে কাঠামোর সাথে মেলে এবং অ্যারে উপাদানটিকে বর্গাকার বন্ধনীগুলিতেও আবৃত করতে হবে। একটি সরল রেকর্ড অনুসন্ধান করার সময় অ্যারে বন্ধনীগুলি ড্রপ করুন।

বিস্তারিত ব্যাখ্যা এবং আরও বিকল্প:


1
@ প্যাকোথেলোভেটাকো: jsonb/ পিজি 9.4 এর জন্য একটি আপডেট যুক্ত করেছে । একদিকে: সাধারণ কেস (নেস্টিংয়ের 1 স্তর) এর জন্য ->অপারেটরও json9g।
এরউইন ব্র্যান্ডসেটেটার

1
@ প্যাকোথ্লোভেটাাকো, পৃষ্ঠা 9.3 এর জন্য, '#>' গোপন সস নয়, '->' আপনার মামলার পক্ষে ঠিক হবে কারণ এটি জসন ওজেটকেও ফিরিয়ে দেয়। '#>' নেস্টেড জেসন পাথ কেসে আরও সহায়ক হবে কারণ এটি আপনাকে সহজেই '{}'
গাব00st

1
@> '[{"src": "foo.png"}]'; যেখানে অবস্থা ভাল কাজ কিন্তু কিভাবে এই জাতীয় নির্দিষ্ট জিনিস মুছতে? আমি এই বিষয়টির সূচি জানি না। আমি মূল মান দ্বারা মুছতে চাই।
প্রণয় সনি

1
@ প্রাণসনি: দয়া করে নতুন প্রশ্নটি প্রশ্ন হিসাবে জিজ্ঞাসা করুন । মন্তব্য জায়গা নয়। আপনি প্রসঙ্গের জন্য সর্বদা এটির সাথে লিঙ্ক করতে পারেন।
এরউইন ব্র্যান্ডসটেটার

প্রিয় @ এরউইন ব্র্যান্ডসটেটার, আংশিক মিলে উভয় নথি খুঁজে পাওয়া সম্ভব? উদাহরণস্বরূপ আমি উভয় রেকর্ডের মতো কিছু পেতে চাই '[{"src": "। png"}]'
পাইরেজকি

8

টাইপ জসন হিসাবে কলাম সহ একটি সারণী তৈরি করুন

CREATE TABLE friends ( id serial primary key, data jsonb);

এখন আসুন জসন ডেটা .োকানো যাক

INSERT INTO friends(data) VALUES ('{"name": "Arya", "work": ["Improvements", "Office"], "available": true}');
INSERT INTO friends(data) VALUES ('{"name": "Tim Cook", "work": ["Cook", "ceo", "Play"], "uses": ["baseball", "laptop"], "available": false}');

এখন ডেটা আনার জন্য কিছু প্রশ্ন করা যাক

select data->'name' from friends;
select data->'name' as name, data->'work' as work from friends;

আপনি লক্ষ্য করেছেন যে ফলাফলগুলি উল্টানো কমা (") এবং বন্ধনী ([]) এর সাথে আসে

    name    |            work            
------------+----------------------------
 "Arya"     | ["Improvements", "Office"]
 "Tim Cook" | ["Cook", "ceo", "Play"]
(2 rows)

এখন কেবলমাত্র ব্যবহৃত মানগুলি পুনরুদ্ধার করতে ->>

select data->>'name' as name, data->'work'->>0 as work from friends;
select data->>'name' as name, data->'work'->>0 as work from friends where data->>'name'='Arya';

22
প্রশ্নের সুস্পষ্ট সংযোগ ছাড়াই এটি আনন্দদায়ক ফরম্যাট করা শব্দ।
এরউইন ব্র্যান্ডস্টেটার

4
আমি এটি দরকারী খুঁজে পেয়েছি। কীভাবে একটি জসনবগুলিতে অ্যারেটি ড্রিল করতে হয় তা দেখায়
গাভিনবেলসন

0

তথ্য নির্বাচন করুন -> 'অবজেক্টস' -> 0 -> 'এসসিআর' টেবিল থেকে এসআরসি হিসাবে যেখানে ডেটা -> 'অবজেক্টস' -> 0 -> 'এসসিআর' = 'foo.png'


2
এটি কেবলমাত্র দরকারী হবে যদি আপনি সূচকটি জানেন, যা 0 ছিল
বায়ুত জোকো রিভাই

হ্যাঁ তবে অ্যারে অবজেক্টটি বিস্ফোরণ করার একটি উপায় রয়েছে যা সারি অনুসারে মানচিত্র তৈরি করবে এবং আমরা এটি ব্যবহার করতে পারি। আমি ভুল হলে আমাকে সংশোধন করুন।
আনন্দ শুক্লা

আপনি যেমন নিশ্চিত হতে পারবেন না তেমন একটি ভাল সমাধান নয়, "
এসসিআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.