在postgresql数据库中,查询的时候,对于一个json字段,怎样删除该json字段中的第二级的一个key呢

在postgresql数据库中,有如下的json类型的数据,查询的时候怎样删除掉score呢?

数据库中该json字段的存储内容
{
"201010023": {"name": "a", "score": 3.2}, 
"201010024": {"name": "b", "score": 2.2}, 
"201010025": {"name": "c", "score": 7.2},
 "201010026": {"name": "d", "score": 3.1}, 
"201010027": {"name": "e", "score": 9.2}, 
"201010028": {"name": "f", "score": 7.2}
}
需要的查询结果
{
"201010023": {"name": "a"}, 
"201010024": {"name": "b", 
"201010025": {"name": "c"},
 "201010026": {"name": "d"}, 
"201010027": {"name": "e"}, 
"201010028": {"name": "f"}
}

数据库中的数据

img

试过用 #-来删除,不过只能一个一个删,不能整个删除

img

看有没有更好的办法实现这个效果

直接用正则可以实现效果:

select 
    id, 
    regexp_replace(json_content::text, '"[\s]*score"\:[\s]*[0-9]*\.[0-9]*,[\s]*', '', 'ig')::json 
from test_json;

源数据

{
  "episodes_info": "",
  "rate": "6.9",
  "cover_x": 1920,
  "title": "咒",
  "url": "https://movie.doudoudou.com/subject/34850561/",
  "playable": false,
  "cover": "https://img3.doudoudouio.com/view/photo/s_ratio_poster/public/p2871258860.jpg",
  "id": "34850561",
  "cover_y": 2782,
  "is_new": false
}

处理SQL

SELECT
    id,
    JSON_EXTRACT( json_str, '$[0].rate', '$[0].cover_x', "$[0].playable" ) AS "json_list",
    JSON_EXTRACT( json_str, '$[0].title' ) AS "title" 
FROM
    json_test;

结果

idjson_listtitle
1[“6.9”, 1920, false]“咒”
2[“6.9”, 1920, false]“咒”
3[“7.7”, 750, false]“稍微想起一些”
4[“7.0”, 743, false]“光年正传”
5[“8.3”, 1170, false]“祝你好运,里奥·格兰德”
6[“8.6”, 1403, false]“宿敌”

可以参考这个:
https://blog.csdn.net/weixin_43932609/article/details/125880378

  • 看下这篇博客,也许你就懂了,链接:postgresql数据库json字段查询
  • 除此之外, 这篇博客: postgresql-json中的 可以查询,但是并不能匹配到结果 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • json_user = User.query.filter(User.info[(‘addr’)].astext.cast(db.String) == ‘beijing’)

  • 以下回答由chatgpt基于相关博客总结生成:

    可以使用jsonb_set函数来删除JSON字段中的第二级key。具体步骤如下:

    1. 首先,使用SELECT语句来查询需要删除的key的位置,使用jsonb_path_query函数可以快速找到需要删除的key的位置。例如,查询名为score的key的位置可以使用以下语句:

    SELECT jsonb_path_query(data, '$.score') FROM table_name;

    其中,data表示JSON字段所在的列名,table_name表示表名。

    1. 找到需要删除的key的位置后,就可以使用jsonb_set函数来删除该key了。例如,删除名为score的key可以使用以下语句:

    UPDATE table_name SET data = jsonb_set(data, '{score}', 'null') WHERE jsonb_path_query(data, '$.score') IS NOT NULL;

    其中,data、table_name和jsonb_path_query函数与步骤1相同,要删除的key的位置使用花括号括起来,将该位置的值设置为null即可删除该key。

    1. 验证是否成功删除,可以再次使用SELECT语句查询该key的位置,如果返回null,则说明删除成功。例如:

    SELECT jsonb_path_query(data, '$.score') FROM table_name;

    如果查询结果为null,则表示成功删除了名为score的key。

    补充说明:上述方法中,使用了jsonb类型的数据和相应的函数,如果需要操作的是json类型的数据,可以使用类似的函数json_path_query和json_set来实现。