【问题标题】:PostgreSQL extract keys from jsonb, exception "cannot call jsonb_object_keys on a scalar"PostgreSQL 从 jsonb 中提取键,异常“无法在标量上调用 jsonb_object_keys”
【发布时间】:2017-07-10 10:31:18
【问题描述】:

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

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

我尝试了 -> 以及一些括号组合,但我总是在 a 中得到 nil。

所以我尝试先获取所有密钥,看看它是否甚至可以识别 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,将此作为问题的一般问题发布。任何特定于 Rails 的解决方案也可以使用。

【问题讨论】:

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


【解决方案1】:

所以问题结果不仅仅是 SQL。

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

去掉这个序列化器并将默认值调整为{}实际上解决了问题。

我认为我的序列化程序对值做了一些事情,但在数据库中,它仍然具有我在问题中提到的正确值。

我仍然不是 100% 清楚问题是什么。但无论如何它都解决了。 如果有人能弄清楚问题到底出在哪里,那就太好了。

希望这可能对某人有所帮助。

【讨论】:

    【解决方案2】:

    在我的例子中,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';
    

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 1970-01-01
      • 2019-05-25
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 2014-07-20
      相关资源
      最近更新 更多