postgresql 修改属性
2016-06-02 21:56
369 查看
up vote2down votefavorite | From this article, I tried to update or delete property of a JSONB column: 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_merge so 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
| |||
add a comment |
activeoldestvotes
up vote3down voteaccepted | Question 1 There should be no signicant drawbacks. As the value is converted back to jsonb anyhow 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;
|
相关文章推荐
- 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
- SQL Server中在存储过程中使用游标修改表中数据