निम्नलिखित मूल उत्तर केवल पोस्टग्रेज 9.3 के लिए लागू होता है। पोस्टग्रेज़ 9.4 उत्तर के लिए, नीचे अद्यतन देखें।
यह इरविन के संदर्भित उत्तरों पर निर्मित होता है , लेकिन इस प्रश्न के लिए थोड़ा अधिक स्पष्ट है।
इस मामले में आईडी bigint
. हैं s, इसलिए JSON सरणी को Postgres bigint
में बदलने के लिए एक सहायक फ़ंक्शन बनाएं सरणी:
CREATE OR REPLACE FUNCTION json_array_bigint(_j json)
RETURNS bigint[] AS
$$
SELECT array_agg(elem::text::bigint)
FROM json_array_elements(_j) AS elem
$$
LANGUAGE sql IMMUTABLE;
हम आसानी से (और शायद अधिक पुन:प्रयोज्य रूप से) एक पाठ
returned लौटा सकते थे इसके बजाय यहाँ सरणी। मुझे bigint
. पर अनुक्रमणित होने का संदेह है पाठ
. से बहुत तेज है लेकिन मुझे इसका समर्थन करने के लिए ऑनलाइन साक्ष्य खोजने में मुश्किल हो रही है।
इंडेक्स बनाने के लिए:
CREATE INDEX "myindex" ON "mytable"
USING GIN (json_array_bigint("blob"->'ids'));
पूछताछ के लिए, यह काम करता है और सूचकांक का उपयोग करता है:
SELECT * FROM "mytable"
WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
ऐसा करना क्वेरी करने के लिए भी काम करेगा, लेकिन यह इंडेक्स का उपयोग नहीं करता है:
SELECT * FROM "mytable"
WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
9.4 के लिए अपडेट करें
पोस्टग्रेज 9.4 ने jsonb
. पेश किया प्रकार। यह jsonbके बारे में एक अच्छा SO उत्तर है कोड> और आपको इसे
. संक्षेप में, यदि आप कभी भी JSON को क्वेरी कर रहे हैं, तो आपको json
पर कब इस्तेमाल करना चाहिए? jsonb
. का उपयोग करना चाहिए ।
यदि आप अपना कॉलम jsonb
. के रूप में बनाते हैं , आप इस क्वेरी का उपयोग कर सकते हैं:
SELECT * FROM "mytable"
WHERE blob @> '{"ids": [185603363289694211]}';
@>
is Postgres' में ऑपरेटर है, दस्तावेज jsonb
. के लिए यहाँ
.धन्यवाद Alain's answer
इसे मेरे ध्यान में लाने के लिए।