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.