【问题标题】:PostgreSQL cannot call json_object_keys on a scalarPostgreSQL 不能在标量上调用 json_object_keys
【发布时间】:2015-07-29 18:54:23
【问题描述】:

我有一个带有 JSON 列的 PostgreSQL 表,我正在尝试获取该列中所有不同键的列表。我为此创建了一个查询:

SELECT DISTINCT json_object_keys(j) FROM t;

其中t 是表,j 是 JSON 列。这可以正确处理一小组数据,它会列出j 中存在的所有键,而不会重复它们。但是,添加更多数据后,它不再起作用,出现错误:

ERROR:  cannot call json_object_keys on a scalar

我不确定为什么会发生这种情况。通过一次仅将查询限制为某些行,我发现了导致错误的行。在该行中,jnull。但是,调用SELECT json_object_keys(null); 不会导致此错误,而调用SELECT json_object_keys(j) FROM t WHERE id=12; 会导致此错误,并且此行中的j 只是null。我真的不确定从这里去哪里。

所以我想我的问题是什么可能导致这种情况,我该如何解决它或防止它发生?

运行 PostgreSQL 9.3.9

编辑:好的,我可能已经先发制人了。我发现有问题的行中的j 不是null,而是'null'::json,仅选择行并不清楚。这确实会导致标量错误,所以现在我只需要找出一种方法来选择j 不是'null'::json 的行。

【问题讨论】:

    标签: json postgresql


    【解决方案1】:

    我尝试了这个查询,用这个查询过滤掉 'null'::json 值:

    SELECT DISTINCT json_object_keys(j) from t WHERE j <> 'null'::json;
    

    但是,显然没有 json json 运算符,所以我不得不将其转换为文本并进行比较。

    SELECT DISTINCT json_object_keys(j) from t WHERE j::TEXT <> 'null';
    

    这行得通!不过,我不是 Postgres 专家,因此这可能不是进行此检查的最有效方式。

    【讨论】:

    • 另外,对于使用 SQLAlchemy 的任何人,在 JSON 列上设置 none_as_null=True 可以完全消除此问题...
    • 使用json_typeof(j)='array'
    • 谢谢彼得。 json_typeof() 是我的游戏规则改变者!一旦知道了值的类型,就可以根据需要对其进行正确的提取和操作。 select json_typeof('{"a":[1,2,3], "c":"some text", "d":true, "e":1000, "f": {"q": 124}}'::json#&gt;'{a}')
    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2018-09-11
    • 2012-08-25
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多