2013-08-05 4 views
6

कोई भी देख सकता है कि यह क्यों काम नहीं करता है? मैनुअल के section 9.15 के अनुसार, -> ऑपरेटर को JSON डेटा प्रकार के तत्वों तक पहुंच प्राप्त करनी चाहिए। ऐसा लगता है कि हालांकि जानकारी स्कीमा कहते स्तंभ टाइप 'json' यह अभी भी वास्तव में एक अदिश स्ट्रिंग है मेरे लिए लग रहा हैJSG टाइप किए गए कॉलम पर JSON ऑपरेटरों का उपयोग कैसे करें postgresql 9.3

postgres=# create table jtest (id serial, data json); 
CREATE TABLE 
postgres=# select column_name, data_type from information_schema.columns where table_name = 'jtest'; 
column_name | data_type 
-------------+----------- 
id   | integer 
data  | json 
(2 rows) 

postgres=# insert into jtest (data) values (to_json('{"k1": 1, "k2": "two"}'::text)); 
INSERT 0 1 
postgres=# select * from jtest; 
id |    data 
----+-------------------------------- 
    1 | "{\"k1\": 1, \"k2\": \"two\"}" 
(1 row) 

postgres=# select data->'k1' from jtest; 
ERROR: cannot extract element from a scalar 
postgres=# select data::json->'k1' from jtest; 
ERROR: cannot extract element from a scalar 
postgres=# \q 
$ pg_ctl --version 
pg_ctl (PostgreSQL) 9.3beta2 

अद्यतन (ध्यान दें उद्धरण जब यह प्रदर्शित होता है।):

मैं इन दो पदों को here और here पाया गया है जो इंगित करता है कि यह ठीक उसी तरह काम करना चाहिए जैसा मैं कर रहा हूं।

postgres=# select * from jtest where data ->> 'k2' = 'two'; 
ERROR: cannot extract element from a scalar 

वहाँ एक निर्माण विकल्प या योगदान मॉड्यूल मैं JSON कार्यक्षमता प्राप्त करने की आवश्यकता है: बस सुनिश्चित करें कि मैं इस कोशिश की जा करने के लिए?

उत्तर

7

ऐसा प्रतीत होता है कि मेरी गलती डेटा डालने पर to_json() फ़ंक्शन का उपयोग कर रही थी। इसके परिणामस्वरूप मेरा डेटा युक्त JSON-encoded स्ट्रिंग हुआ। मुझे पोस्टग्रेस्क्ल दस्तावेज़ों में कुछ भी नहीं मिला जो दिखा रहा है कि जेएसओएन डेटा कैसे सम्मिलित किया जाए, लेकिन अंततः मुझे यह पोस्ट here मिला जो एक उदाहरण दिखाता है। मैंने किया जाना चाहिए था:

postgres=# insert into jtest (data) values ('{"k1": 1, "k2": "two"}'); 
INSERT 0 1 
postgres=# select * from jtest; 
id |   data 
----+------------------------ 
    1 | {"k1": 1, "k2": "two"} 
(1 row) 

(डेटा स्तंभ में मान पर उद्धरण की कमी पर ध्यान दें।)

अब यह काम करता है:

postgres=# select * from jtest where data ->> 'k2' = 'two'; 
id |   data 
----+------------------------ 
    1 | {"k1": 1, "k2": "two"} 
(1 row) 
+0

पोस्ट के लिए धन्यवाद; एक json कॉलम में कनवर्ट करने के लिए to_json का उपयोग करने की भी एक ही समस्या थी। मैं वापस गया और सीएएसटी (फ़ील्ड_नाम जेसन के रूप में) का इस्तेमाल किया और सब कुछ अपेक्षित के रूप में काम किया। –

संबंधित मुद्दे