如何解决从 postgres
我正在研究一种以 JSON 字符串形式存储在数据库中的数据结构。我正在使用 postgres 数据库。
我有一个名为 usersettings 的表。其中有两列。
一列是 id(主键和自动递增),另一列是设置(输入文本)。
设置栏包含 JSON 格式的数据(见下例)
{
"SUBJECTS":[
"Maths","Physics"
],"NAME":[
"Thomas"
],"EMAIL_ADDRESS":"abc@xyz.com","CITY":[
"Newyork"
],"USER_ID":3,"TYPE":[
"Secondary"
]
}
这里的json数据包含json数组。我需要一个 select sql 查询,使用它我只能获取那些包含特定 USER_ID(在上面的示例中为 3)且其主题包含数学的行。
解决方法
假设您已升级到 Postgres 版本 (12,13),您可以使用递归 CTE 将每行的 JSON 结构展平,将每行设置的用户 ID 与“主题”数组中的每个项目相关联“ 钥匙。然后,可以使用带有 exists
的子查询来查找以“数学”为主题的用户 ID:
with recursive cte(uid,js,subject,sid) as (
select u.settings::json -> 'USER_ID',u.settings,(u.settings::json -> 'SUBJECTS')::json ->> 0,1 from usersettings u
union all
select c.uid,c.js,(c.js::json -> 'SUBJECTS'):: json ->> c.sid,c.sid+1 from cte c where c.sid < json_array_length(c.js::json -> 'SUBJECTS')
),results(id,subject) as (select uid::TEXT,subject from cte)
select distinct r1.id from results r1 where exists (select 1 from results r2 where r2.id = r1.id and r2.subject = 'Maths');
输出:
id |
---|
3 |
见demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。