2013-08-05 12 views
6

Kann jemand sehen verwenden, warum dies nicht funktioniert? Nach section 9.15 des Handbuchs sollte die -> Operator-Elemente eines Typs JSON-Daten zugreifen. Es scheint mir, wie, obwohl das Info-Schema sagt der Spalte Typ ‚json‘ ist es noch wirklich ein Skalar StringWie JSON Operatoren auf JSON typisierte Spalte in 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 

Update (die Anführungszeichen beachten, wenn es angezeigt wird.):

I diese beiden Beiträge here und here gefunden, die es zeigen sollte genau arbeiten, wie ich tue. Nur um sicherzugehen ich dies versucht:

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

Gibt es eine Build-Option oder contrib Modul Ich brauche JSON-Funktionalität zu bekommen?

Antwort

7

Es scheint, dass mein Fehler der to_json() Funktion wurde mit, wenn die Daten einfügen. Das führte zu einer JSON-kodierte String meine Daten enthält. Ich habe nichts in dem postgresql docs zeigt, wie JSON-Daten einfügen, aber ich fand schließlich diesen Beitrag here, das ein Beispiel gezeigt. Ich hätte getan:

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) 

(das Fehlen von Zitaten auf dem Wert in der Datenspalte beachten.)

Jetzt funktioniert es:

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

Danke für den Beitrag; hatte auch das gleiche Problem mit to_json zu konvertieren in eine JSON-Spalte. Ich ging zurück und benutzte CAST (field_name als json) und alles funktionierte wie erwartet. –

Verwandte Themen