PostgreSQL JSON কোয়েরি অ্যারে একাধিক মানের


18

আমি jsonbপোস্টগ্রাসে টাইপের বিপরীতে একটি ক্যোয়ারী লিখতে চাই যা গ্রাহকদের আইডির একটি অ্যারে দিলে সংশ্লিষ্ট গোষ্ঠীগুলি খুঁজে পেতে পারে।

এই উদাহরণ সারণী দেওয়া:

CREATE TABLE grp(d JSONB NOT NULL);

INSERT INTO grp VALUES
   ('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
 , ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
 , ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');

আমি অনুরূপ প্রশ্ন পেয়েছি ( একাধিক মানের বিপরীতে PostgreSql JSONB SELECT ) এবং এই কোয়েরিটি ব্যবহার করে আমি সাধারণ অ্যারেতে যা চাই তা অর্জন করতে পরিচালিত:

SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];

যাইহোক, যখন অ্যারেতে JSON অবজেক্ট থাকে তখন আমি এটি কাজ করতে পারি না :

SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];

আমার জিজ্ঞাসা থেকে আমি যা প্রত্যাশা করি তা এখানে:

grp "প্রথম" -> গ্রাহক "1"

grp "তৃতীয়" -> গ্রাহক "5"

উত্তর:


17

একটি উপায় আছে: কনস্ট্রেন্ট অপারেটরটি @>ANYকনস্ট্রাক্টের সাথে একত্রিত করুন :

SELECT d
FROM   grp
WHERE  d->'customers' @> ANY (ARRAY ['[{"id":"1"}]', '[{"id":"5"}]']::jsonb[]);

বা:

...
WHERE d->'customers' @> ANY ('{"[{\"id\": \"1\"}]","[{\"id\": \"5\"}]"}'::jsonb[]);

jsonb[]স্পষ্টভাবে অ্যারে কাস্ট করা অপরিহার্য । এবং নোট করুন যে প্রতিটি উপাদানটির ভিতরে অপারেটরের প্রয়োজন মতো একটি JSON অ্যারে থাকে@> । সুতরাং এটি JSON অ্যারেগুলির একটি অ্যারে।

আপনি এর জন্য একটি সূচক ব্যবহার করতে পারেন:

ম্যানুয়াল স্পষ্টভাবে যুক্তরাষ্ট্রের যে অপারেটর ?|জন্য স্ট্রিং শুধুমাত্র।

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