首页 > 解决方案 > 将文本列转换为 json 数组

问题描述

我的数据库中有一个列(类型 TEXT),用于存储动态清单项目,以以下格式存储:[{"checked":"true","nome":"CNH Colorida"},{"checked":"false","nome":"Contrato social"},{"checked":"false","nome":"Última fatura de energia"}]. 我需要使用 SQL 来检查其中哪些被检查,哪些没有被检查。我曾经有一个 PHP 代码,json_decode该字符串然后迭代它,但我希望能够直接从 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 数组是用 定义的{},而不是[]. 如果我翻译[]to {},我会得到这个错误:

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

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

标签: arraysjsonpostgresql

解决方案


将文本转换为 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


推荐阅读