微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 postgres

如何解决从 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 举报,一经查实,本站将立刻删除。