कई मूल्यों के खिलाफ 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 d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];

हालाँकि, जब JSON ऑब्जेक्ट में सरणी होती है, तो मैं इसे काम नहीं कर सकता :

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

यहाँ मैं अपनी क्वेरी से उम्मीद करता हूँ:

जीआरपी "प्रथम" -> ग्राहक "1"

जीआरपी "तीसरा" -> ग्राहक "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 सरणियों की एक सरणी है।

आप इसके लिए एक सूचकांक का उपयोग कर सकते हैं:

मैनुअल स्पष्ट रूप से कहा है कि ऑपरेटर ?|के लिए है तार केवल।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.