【问题标题】:Convert a text column to an array of json将文本列转换为 json 数组
【发布时间】:2019-08-08 14:31:35
【问题描述】:

我的数据库中有一个列(类型 TEXT),用于存储动态清单项目,存储格式如下:[{"checked":"true","nome":"CNH Colorida"},{"checked":"false","nome":"Contrato social"},{"checked":"false","nome":"Última fatura de energia"}]。我需要使用 SQL 来检查其中哪些被检查,哪些没有被检查。我曾经有一个json_decode 字符串然后对其进行迭代的PHP 代码,但我希望能够直接从SQL 中执行此操作。 PostgreSQL 版本是 9.4。

当我尝试将返回的行转换为 json (select valor::json) 时,没有任何反应,如果我尝试将其转换为 json 数组 (select valor::json[]),我收到以下错误:

SQL Error [22P02]: ERROR: malformed array literal: "[]"
Details: "[" must introduce explicitly-specified array dimensions.

通过研究,我发现 PostgreSQL 数组是用{} 定义的,而不是[]。如果我将[] 翻译成{},我会得到这个错误:

SQL Error [22P02]: ERROR: malformed array literal: "{{"checked":true,"nome":"Importado"},{"checked":false,"nome":"Finame"},{"checked":false,"nome":"MDA"}}"
Details: Unexpected array element.

我还能尝试什么让它工作?

【问题讨论】:

  • 我想你正在寻找SELECT json_agg(<column>) ...。您可能需要使用unnest() 删除外部方括号。以下是一些您可以参考的文档:postgresql.org/docs/9.4/functions-aggregate.html
  • “什么都没有发生”到底是什么意思。在将 text 值转换为 json 后,您期望什么 - 这不会改变显示。
  • @a_horse_with_no_name 列类型不会更改为 json,它保持为文本列。如果我以正确的 json 格式(不是数组)进行相同的类型转换,则列类型将更改为 json。
  • JSON 的显示方式与文本相同,因此仅从显示中您无法真正分辨出它是什么类型:i.imgur.com/sZcksqw.png

标签: arrays json postgresql


【解决方案1】:

将文本转换为 json 后,您需要取消嵌套数组并提取键值:

select d.v ->> 'nome' as name
from the_table t, json_array_elements(t.valor::json) as d(v)
where d.v ->> 'checked' = 'true';

在线示例:https://rextester.com/TSRF14508

【讨论】:

  • 我没有在json_array_elements 中使用::json!使用它后,我设法让它工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2013-08-22
  • 2020-10-15
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 2017-10-10
相关资源
最近更新 更多