PostgreSQL从jsonb中提取键,异常“无法在标量上调用jsonb_object_keys”

时间:2017-07-10 10:31:18

标签: sql ruby-on-rails json postgresql jsonb

我正试图在Postgres中使用jsonb。这里有很多问题,我想做的是:

SELECT table.column->>'key_1' as a FROM "table"

我试过 - >还有一些括号的组合,但我总是在一个。

所以我首先尝试获取所有密钥以查看它是否正在识别jsonb。

SELECT jsonb_object_keys(table.column) as a FROM "table"

这引发了一个错误:

cannot call jsonb_object_keys on a scalar

所以,要检查列类型(我创建的列,所以我知道它是jsonb,但无论如何)

SELECT  pg_typeof(column) as a FROM "table" ORDER BY "table"."id" ASC LIMIT 1

这在结果中正确地给了我“jsonb”。

column中的

值类似于{"key_1":"New York","key_2":"Value of key","key_3":"United States"}

所以,我真的很困惑这里发生了什么,为什么它将我的json数据称为标量?它实际意味着什么以及如何解决这个问题?

这方面的任何帮助都会非常有帮助。

PS:我正在使用rails,将此作为问题的一般问题发布。任何特定于轨道的解决方案都可以使用。

2 个答案:

答案 0 :(得分:1)

所以问题结果是只有SQL而不是。

正如我所提到的,我使用的是rails(5.1),我使用了默认值'{}'作为jsonb列。我通过在表的模型中定义它来为列使用双向串行器。

删除此序列化程序并将默认值调整为{}实际上解决了问题。

我认为我的序列化程序正在对值进行操作,但仍然在数据库中,它具有正如我在问题中提到的正确值。

我仍然没有100%清楚问题是什么。但无论如何它已经解决了。 如果有人能够详细说明问题究竟是什么,那就太棒了。

希望这可能有助于某人。

答案 1 :(得分:0)

在我的情况下,ORM层以某种方式设法将一个null字符串写入JSON列,而Postgres对此感到满意。尝试对此值执行json_object_keys会导致OP错误。

我已设法找到允许此类null字符串的位置,在修复代码后,我还使用以下查询修复了数据:

UPDATE tbl SET col = '{}'::jsonb WHERE jsonb_typeof(col) <> 'object';

如果您故意混合存储在列中的类型(例如,有时它是一个对象,有时是数组等),您可能希望过滤掉所有不包含具有简单WHERE的对象的行:

SELECT jsonb_object_keys(tbl.col) as a FROM tbl WHERE jsonb_typeof(col) = 'object';