मैं नए PostgreSQL JSON डेटाटाइप के अंदर फ़ील्ड का उपयोग करके क्वेरी कैसे कर सकता हूं?


216

मैं PostgreSQL 9.2 में नए JSON फ़ंक्शंस के लिए कुछ डॉक्स और / या उदाहरणों की तलाश कर रहा हूं।

विशेष रूप से, JSON रिकॉर्ड की एक श्रृंखला दी गई है:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]

मैं नाम से रिकॉर्ड खोजने के लिए एसक्यूएल कैसे लिखूंगा?

वेनिला एसक्यूएल में:

SELECT * from json_data WHERE "name" = "Toby"

आधिकारिक देव मैनुअल काफी विरल है:

अपडेट I

मैंने एक साथ एक gist का विवरण दिया है जो वर्तमान में PostgreSQL 9.2 के साथ संभव है । कुछ कस्टम फ़ंक्शंस का उपयोग करते हुए, ऐसा करना संभव है:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';

अपडेट II

मैंने अब अपने JSON फ़ंक्शन को अपने प्रोजेक्ट में स्थानांतरित कर दिया है:

PostSQL - PostgreSQL और PL / v8 को पूरी तरह से भयानक JSON दस्तावेज़ स्टोर में बदलने के लिए फ़ंक्शन का एक सेट


3
अभी हाल ही में मुझे यह ब्लॉग पोस्ट मैट सिनचेकेल के द्वारा मिला, जो पोस्टग्रैसीक्यूएल में JSON के बारे में विस्तार से बताता है schinckel.net/2014/05/25/querying-json-in-postgres
19

1
@knowbody यह पोस्ट वास्तव में JSONB को क्वेरी करने के बारे में है, जो JSON से काफी अलग है। पोस्ट में स्पष्ट नहीं करने के लिए मेरा बुरा है।
मैथ्यू Schinckel

जवाबों:


177

पोस्टग्रेट्स 9.2

मैं एंड्रयू डंस्टन को pgsql- हैकर्स सूची पर उद्धृत करता हूं :

किसी स्तर पर संभवतः कुछ जोंस-प्रोसेसिंग (जसन-उत्पादन के विपरीत) कार्य होंगे, लेकिन 9.2 में नहीं।

उसे PLV8 में एक उदाहरण कार्यान्वयन प्रदान करने से नहीं रोकता है जो आपकी समस्या को हल करना चाहिए।

9.3 पोस्ट करता है

"जोंस-प्रोसेसिंग" जोड़ने के लिए नए कार्यों और ऑपरेटरों का एक शस्त्रागार प्रदान करता है।

पोस्टग्रेज 9.3 में मूल प्रश्न का उत्तर :

SELECT *
FROM   json_array_elements(
  '[{"name": "Toby", "occupation": "Software Engineer"},
    {"name": "Zaphod", "occupation": "Galactic President"} ]'
  ) AS elem
WHERE elem->>'name' = 'Toby';

उन्नत उदाहरण:

बड़े तालिकाओं के लिए आप प्रदर्शन बढ़ाने के लिए एक अभिव्यक्ति सूचकांक जोड़ना चाह सकते हैं:

पदावनत 9.4

जोड़ता है jsonb("बाइनरी" के लिए मान, मूल्यों को मूल पोस्टग्रेज प्रकार के रूप में संग्रहीत किया जाता है) और फिर भी दोनों प्रकार के लिए अधिक कार्यक्षमता । ऊपर उल्लिखित एक्सप्रेशन इंडेक्स के अलावा, GIN, btree और हैश इंडेक्सjsonb का भी समर्थन करता है , GIN इनमें से सबसे शक्तिशाली है।

सुझाव देने के लिए मैनुअल जहाँ तक जाता है:

सामान्य तौर पर, अधिकांश एप्लिकेशन को JSON डेटा को स्टोर करना पसंद करना चाहिए jsonb , जब तक कि कोई विशेष आवश्यकता न हो, जैसे कि ऑब्जेक्ट कुंजी के आदेश के बारे में विरासत की धारणाएं।

बोल्ड जोर मेरा।

GIN अनुक्रमित में सामान्य सुधार से प्रदर्शन लाभ।

9.5 पर पोस्ट करता है

पूर्ण jsonbकार्यों और ऑपरेटरों। jsonbजगह में और प्रदर्शन के लिए हेरफेर करने के लिए और अधिक फ़ंक्शन जोड़ें ।


1
धन्यवाद, मैं PLV8 दृष्टिकोण का उपयोग करके वास्तव में तेजी से टाइप के मुद्दों में चला गया हूं। होनहार लगता है, लेकिन इस समय वास्तव में प्रयोग करने योग्य नहीं है।
टोबी हैड

@TobyHede: लगता है कि हमें 9.3 के लिए इंतजार करना होगा।
एरविन ब्रान्डेसटेटर

1
@ जोशाव: धन्यवाद, मैंने तदनुसार अपडेट किया और पोस्टग्रैज विकी के लिए एक लिंक जोड़ा।
एरविन ब्रान्डसेट्टर

@ErwinBrandstetter अगर मैं कहां से देख रहा हूं - >> 'सही' = 'सही'; और JSON इस तरह दिखता है: "सही": "सही", तार्किक शब्दों को क्वेरी करने का सही तरीका क्या है?
शिराज

@ धीरज: कृपया नए प्रश्न प्रश्न के रूप में पूछें । टिप्पणियाँ जगह नहीं हैं।
इरविन ब्रान्डेसटेटर

87

Postgres 9.3+ के साथ, बस ->ऑपरेटर का उपयोग करें । उदाहरण के लिए,

SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;

कुछ अच्छे उदाहरण और एक ट्यूटोरियल के लिए http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/ देखें ।


2
उदाहरण में आप एक क्षेत्र नामित होना चाहिए ऊपर dataएक JSON दस्तावेज़ के साथ: {images:{thumbnail:{url:'thumbnail.jpg'}}}। हमें बताएं कि आपका डेटा कैसा दिखता है और क्या क्वेरी विफल हो रही है।
मियोकी


6
यदि कोई सरणी है तो आप कैसे क्वेरी कर सकते हैं? मैं # >> ऑपरेटर देखता हूं लेकिन इसका उपयोग करने के लिए कोई सुराग नहीं है!
मोहम्मद एल महलावी

इस चुनिंदा क्वेरी में मैं वाइल्डकार्ड का उपयोग कर सकता हूं? IeSELECT data->'%'->'thumbnail'->'url' AS thumb FROM instagram;
भारत

@ मीकोही का जवाब अच्छी तरह से काम करता है: विशेष रूप से मुझे ::jsonअन्य पदों में वर्णित के रूप में आवश्यकता नहीं थी । यह भी ध्यान दें कि ->यदि आप किसी ऐसी संपत्ति का उपयोग करने की कोशिश करते हैं जो मौजूद नहीं है (यानी यदि आपने JSON को कंपित किया है) तो ऑपरेटर एक त्रुटि को फेंक देगा:ERROR: column "jsonPropertyYouWant" does not exist
लाल मटर

19

ऑब्जेक्ट एक्सेस के लिए 9.3 उपयोग -> पोस्टग्रेज के साथ। 4 उदाहरण

seed.rb

se = SmartElement.new
se.data = 
{
    params:
    [
        {
            type: 1,
            code: 1,
            value: 2012,
            description: 'year of producction'
        },
        {
            type: 1,
            code: 2,
            value: 30,
            description: 'length'
        }
    ]
}

se.save

रेल सी

SELECT data->'params'->0 as data FROM smart_elements;

रिटर्न

                                 data
----------------------------------------------------------------------
 {"type":1,"code":1,"value":2012,"description":"year of producction"}
(1 row)

आप नेस्टिंग जारी रख सकते हैं

SELECT data->'params'->0->'type' as data FROM smart_elements;

वापसी

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