我在尝试访问JSON对象中的数据时遇到此错误,是否有人知道它是由什么引起的?
这是查询:
SELECT id, data FROM cities WHERE data->'location'->>'population' = '270816'
这是JSON对象:
location": {
"population": 270816,
"type": "city"
}
任何帮助都会非常感激。感谢
答案 0 :(得分:0)
我能够让这个SELECT
在 Postgres 9.3.1中工作。这是sqlfiddle,说明了这一点。
以下是我在 sqlfiddle 中使用的 DDL 和INSERT
语句:
create table cities
(
id serial,
data json
);
insert into cities (data) VALUES
('{
"location": {
"population": 270816,
"type": "city"
}
}'
);
您使用的是什么版本的Postgres?你是如何插入 JSON 的?您cities
表的 DDL 是什么?
怀疑它可能是您插入JSON数据的方式的问题。尝试插入它类似于我在上面的 sqlfiddle 中所做的方式,看看它是否适合你。即作为纯 SQL 字符串,但其中包含有效 JSON 的字符串,位于定义为json
的列中。
答案 1 :(得分:0)
刚刚在Postgres 9.6.6上听到了同样的问题。不正确的字符串转义导致了神秘的JSONB行为。使用pgAdmin4,
CREATE TABLE json_test (json_data JSONB);
INSERT INTO json_test (json_data) VALUES ('"{\"id\": \"test1\"}"');
INSERT INTO json_test (json_data) VALUES ('{"id": "test2"}');
SELECT json_data, json_data->>'id' as id FROM json_test;
返回以下pgAdmin4输出showing baffling failure to find id test2.结果显示pgAdmin4显示有误导性。使用PSQL中的文本显示情况变得清晰:
db=> CREATE TABLE json_test (json_data JSONB);
CREATE TABLE
db=> INSERT INTO json_test (json_data) VALUES ('"{\"id\": \"test1\"}"');
INSERT 0 1
db=> INSERT INTO json_test (json_data) VALUES ('{"id": "test2"}');
INSERT 0 1
db=> SELECT json_data, json_data->>'id' as id FROM json_test;
json_data | id
-----------------------+-------
"{\"id\": \"test1\"}" |
{"id": "test2"} | test2
(2 rows)
很明显第一行是作为一个看起来像JSON的字符串插入的,而不是嵌套的JSON对象。