无法从标量中提取元素 - postgresql错误

时间:2014-10-07 16:08:39

标签: json postgresql

我在尝试访问JSON对象中的数据时遇到此错误,是否有人知道它是由什么引起的?

这是查询:

SELECT id, data FROM cities WHERE data->'location'->>'population' = '270816'

这是JSON对象:

location": {

"population": 270816,
"type": "city"

}

任何帮助都会非常感激。感谢

2 个答案:

答案 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对象。