2013-08-05 4 views
6

Czy ktoś może zrozumieć, dlaczego to nie działa? Zgodnie z section 9.15 instrukcji operator -> powinien uzyskać dostęp do elementów typu danych JSON. Wygląda mi na to, chociaż schemat informacji mówi, że kolumna jest typu „json” nadal jest naprawdę skalarne ciągJak korzystać z operatorów JSON na kolumnie z wpisanymi JSON w 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 (zauważ cytaty, gdy jest on wyświetlany.):

I znalazłem te dwa posty here i here, które wskazują, że powinien działać dokładnie tak jak ja. Po prostu na pewno próbowałem to:

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

Czy istnieje opcja kompilacji lub moduł contrib potrzebuję uzyskać funkcjonalność JSON?

Odpowiedz

7

Wygląda na to, że moim błędem było używanie funkcji to_json() podczas wstawiania danych. W wyniku tego kodowany przez JSON ciąg zawierał moje dane. Nie znalazłem niczego w dokumentacji postgresql pokazującej jak wstawić dane JSON, ale ostatecznie znalazłem ten post here który pokazał przykład. powinienem zrobić:

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) 

(zauważ brak cytatów na wartości w kolumnie danych.)

Teraz to działa:

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

Dzięki za posta; również miał ten sam problem z użyciem to_json do konwersji w kolumnę json. Wróciłem i użyłem CAST (field_name jak json) i wszystko działało zgodnie z oczekiwaniami. –