2016-04-26 12 views
5

पर एसक्यूएल परिणामसेट को ट्रांसफॉर्म करें मैं अपने वेबप्लिकेशंस के लिए पोस्टग्रेस्क्ल का उपयोग कर रहा हूं। मैं इस पोस्टग्रेस्क्ल-जेसन के लिए नया हूं। मैं सिर्फ जेसन संरचना के रूप में चयन क्वेरी परिणाम प्राप्त करना चाहता हूं।जेएसन

create table sample(id serial, info jsonb); 
insert into sample("info") values('{"person": {"phone": 9804484234,"name":{"firstname":"Alice", "lastname":"bob"}, "empId": "E067", "age":25}'); 

चयन क्वेरी:

select "info"->'person'->>'lastname' from sample; 

परिणाम: बॉब

लेकिन मैं नीचे की तरह json नोड्स के साथ ऊपर परिणाम प्राप्त करना चाहते हैं:

result: {"person": 
      {"name": 
      {"lastname":"bob"} 
      } 
     } 
यहाँ मेरी जानकारी दी जा रही

कोई भी शरीर मुझे बता सकता है कि डेटाबेस से मेरी अपेक्षित परिणाम संरचना कैसे प्राप्त करें।

+0

हैलो सभी, कृपया मुझे बताएं कि मेरी क्वेरी स्पष्ट नहीं है करते हैं। यदि आवश्यक हो तो मैं अधिक जानकारी प्रदान करूंगा। –

+0

क्या आप कृपया कुछ शरीर मुझे बता सकते हैं, क्या यह संभव है या नहीं? –

+0

सवाल यह नहीं समझता कि आप ऐसा क्यों करना चाहते हैं। यदि आप अंतिम नाम बॉब वाले किसी व्यक्ति के लिए संपूर्ण जेसन दस्तावेज़ प्राप्त करने का प्रयास कर रहे थे जो समझ में आएगा, या आपका कोड वर्तमान में क्या करता है जो अंतिम नाम के लिए जेसन का विश्लेषण करता है, तो समझ में आता है, लेकिन आप केवल जेसन को जिस तरह से चाहते हैं पूछ रहे हैं समझ में नहीं आता है और पोस्टग्रेज़ में आसानी से ऐसा करने का कोई तरीका नहीं है। json_extract_path जो आप मांग रहे हैं उसके करीब आता है। –

उत्तर

1

के लिए और अधिक सरल हो जाएगा:

एक सामान्य PostgresSQL डेटाबेस A- और json के जवाब बदलना।

  • ए 1। एक सामान्य एसक्यूएल डीबी (और कोई पोस्टग्रेस एसक्यूएल जेसन) स्टोर करें
  • ए 2। एक SQL परिणामसेट पुनर्प्राप्त करें (क्वेरी का चयन करें)
  • ए 3। इस कोड को

    public class SOF_36861985 { 
    
          public static JSONArray toJson(ResultSet res) throws Exception { 
           JSONArray array = new JSONArray(); 
           while (res.next()) { 
            int size = res.getMetaData().getColumnCount(); 
            JSONObject obj = new JSONObject(); 
            for (int i = 0; i < size; i++) { 
             obj.put(res 
               .getMetaData() 
               .getColumnLabel(i + 1) 
               .toLowerCase(), 
               res.getObject(i + 1)); 
             array.put(obj); 
            } 
           } 
           return array; 
          } 
    
        } 
    

या

बी का प्रयोग करें MongoDB json देशी डेटाबेस है कि

  • बी 1 के साथ json में resultset कनवर्ट करें। MongoDB में स्टोर डेटा को जेसन
  • बी 2 के रूप में स्टोर करें। क्वेरी MongoDB json resultset वापस आ जाएगी

समाधान एक की comparation बनाम समाधान बी

समाधान एक: एसक्यूएल + एक नया डीबी के लिए आप के लिए मजबूर नहीं है, आप PostgresSQL के साथ जारी रहेगा - कर देगा ResultSet से Json करने के लिए एक रूपांतरण - SQL डेटाबेस में स्थिर स्कीमा (NoSQL में के रूप में कोई गतिशील स्कीमा)

समाधान बी होगा: मोंगो - डीबी के परिवर्तन करता है, कि उत्पादन निर्भर है ... और infras पर प्रभाव पड़ता है tructure .... + json देशी डीबी + शायद आपके लिए एक नई डीबी है है, तो आप एक सीखने समय यह गुरु करना होगा (अधिक समय सेटअप करने के लिए, देव ले जाएगा स्थापित करते हैं, ...)

1

स्ट्रिंग स्थिर के रूप में आप जिस पथ का अनुसरण कर रहे हैं उसे पुन: पेश कर सकते हैं, बशर्ते पथ तय हो।

select '{"person":{"name":{"lastname":"' || 
(info->'person'->'name'->>'lastname') || 
'"}}}'as val from sample; 
+0

मैं उपर्युक्त वाक्यविन्यास का उपयोग कर रहा हूं लेकिन मुझे कोई उचित आउट नहीं मिला। कंसोल में यह 1 पंक्ति दिखा रहा है लेकिन कोई आउटपुट नहीं है। –

+0

हां मुझे आउटपुट मिला लेकिन क्या यह जेसन आउटपुट प्राप्त करने का एकमात्र तरीका है? क्योंकि मेरे पास घोंसला वाले जेसन डेटा हैं। मैं प्रत्येक नोड पर नहीं जा सकता। –

+0

दुर्भाग्य से, जेएसओएन में कोई डोम नहीं है, कोई XPath या कुछ समान नहीं है। एक्सएमएल के विपरीत जो दस्तावेज़ प्रारूप जेएसओएन को हल्के संदेश प्रारूप के बजाय भंडारण विकल्प के रूप में तैयार किया गया है। Postrgesql के पास JSON पथ, थोड़े-पथ-टू-रूट पर काम करने के लिए कोई तरीका नहीं है। – Serg

0
SELECT json_build_object("person", 
    json_build_object("name", 
    json_build_object("lastname", 
    (info->'person'->'name'->>'lastname')))) 
AS val FROM sample; 
संबंधित मुद्दे