【发布时间】: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