在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"}
}
数据库中的数据
试过用 #-来删除,不过只能一个一个删,不能整个删除
看有没有更好的办法实现这个效果
直接用正则可以实现效果:
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;
结果
id | json_list | title |
---|---|---|
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
json_user = User.query.filter(User.info[(‘addr’)].astext.cast(db.String) == ‘beijing’)
可以使用jsonb_set函数来删除JSON字段中的第二级key。具体步骤如下:
SELECT jsonb_path_query(data, '$.score') FROM table_name;
其中,data表示JSON字段所在的列名,table_name表示表名。
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。
SELECT jsonb_path_query(data, '$.score') FROM table_name;
如果查询结果为null,则表示成功删除了名为score的key。
补充说明:上述方法中,使用了jsonb类型的数据和相应的函数,如果需要操作的是json类型的数据,可以使用类似的函数json_path_query和json_set来实现。