postgresql删除属性
2016-06-02 21:57
961 查看
PostgreSQL update and delete property from JSONB column
![](http://www.cnblogs.com/flintlovesam/p/file:/E:/learning/aaa/aaa/PostgreSQL%20update%20and%20delete%20property%20from%20JSONB%20column%20-%20Database%20Administrators%20Stack%20Exchange_files/i.gif)
up vote 2 down vote favorite | From this article, I tried to update or delete property of a JSONBcolumn: CREATE TABLE xxx (id BIGSERIAL, data JSONB); INSERT INTO xxx(data) VALUES( '{"a":1,"b":2}' ); SELECT * FROM data; id | data ----+------------------ 1 | {"a": 1, "b": 2} create the update function: CREATE FUNCTION jsonb_merge(JSONB, JSONB) RETURNS JSONB AS $$ WITH json_union AS ( SELECT * FROM JSONB_EACH($1) UNION ALL SELECT * FROM JSONB_EACH($2) ) SELECT JSON_OBJECT_AGG(key, value)::JSONB FROM json_union; $$ LANGUAGE SQL; testing: -- replace UPDATE xxx SET data = jsonb_merge(data,'{"b":3}') WHERE id = 1; SELECT * FROM xxx; id | data ----+------------------ 1 | {"a": 1, "b": 3} -- append UPDATE xxx SET data = jsonb_merge(data,'{"c":4}') WHERE id = 1; SELECT * FROM xxx; id | data ----+------------------------- 1 | {"a": 1, "b": 3, "c": 4} The question is: is there any drawback of using JSONB_EACH(jsonb_merge) instead of JSONB_EACH_TEXT(from the article) in this case? how to modify the jsonb_mergeso if the second parameter property value is null(something like {"b":null}) the value would be erased? . -- remove UPDATE xxx SET data = jsonb_merge(data,'{"b":null}') WHERE id = 1; SELECT * FROM xxx; id | data ----+----------------- 1 | {"a": 1, "c": 4} postgresql postgresql-9.4
| |||
1 Answer 1
active oldest votesup vote 3 down vote accepted | Question 1 There should be no signicant drawbacks. As the valueis converted back to jsonbanyhow I would guess it would be more efficient to keep it that way the whole time. Question 2 Just replace your function with the following (only the part WHERE key NOT IN ...added): CREATE FUNCTION jsonb_merge(JSONB, JSONB) RETURNS JSONB AS $$ WITH json_union AS ( SELECT * FROM JSONB_EACH($1) UNION ALL SELECT * FROM JSONB_EACH($2) ) SELECT JSON_OBJECT_AGG(key, value)::JSONB FROM json_union WHERE key NOT IN (SELECT key FROM json_union WHERE value ='null'); $$ LANGUAGE SQL; |
相关文章推荐
- postgresql 修改属性
- Install DBD::mysql for Perl in XAMPP in Mac , solving errors
- 数据源(数据库连接池)
- sql技巧-构造分组条件
- Oracle11gR2_RAC_for_redhat6.3 安装手册
- redis sadd存缓存
- window 下mysql5.7.12安装报错记录
- mysql 创建函数
- mysql 创建函数
- mysql 创建函数
- oracle-union order by rownum排序与取数
- postgresql create db and table
- 数据库架构实践
- 多线程写mysql
- SQL Server自动化运维系列——关于数据收集(多服务器数据收集和性能监控)
- postgreSQL格式化时间的函数详解
- 抓取新浪数据
- sql语句中----删除表数据drop、truncate和delete的用法
- redis安装,检测redis是否安装成功以及配置redis密码
- _mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h':no such file or directory