arrays - 将文本列转换为 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.
我还能尝试什么让它工作?
解决方案
将文本转换为 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';
推荐阅读
- python - 在 Flask 的 HTML 页面上打印 python 控制台输出
- python - python 错误使用 amazon ses 和 aws lambda 发送邮件
- javascript - React 绑定到 reactDOM 之外的 HTML 元素
- haskell - 无需通过 Template Haskell 将函数转换为预先计算的查找表
- javascript - 比较angularjs中的角度副本和更改的数据并仅发送更改的项目
- python - Python3:如何比较两个嵌套和动态的字典的数据?
- azure - 如何通过 Azure ARM 模板部署引用不在 VM/App 网关资源组中的另一个 Vnet 的 VM/App 网关
- java - calendar.getDisplayName 返回错误的日期
- python - 估计图像的信噪比
- python - 使用正则表达式排序