postgresql 修改属性


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:

  1. is there any drawback of using JSONB_EACH (jsonb_merge) instead of JSONB_EACH_TEXT (from the article) in this case?
  2. 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


shareimprove this question


edited Mar 20 ‘15 at 10:23


asked Mar 20 ‘15 at 6:06

Kokizzu

273312

 
add a comment

1 Answer

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;


shareimprove this answer

时间: 2024-12-15 13:33:38

postgresql 修改属性的相关文章

js 动态修改属性值 动态修改图片,字等

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"   http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv = "content-type" content="text/html;charset=utf-8"/> &

通过反射 修改访问和修改属性的值 Day25

package com.sxt.field; /* * 通过反射拿到属性值 * 修改public属性值 * 修改private属性值 * 缺点:可读性差:代码复杂 * 优点:灵活:可以访问修改private属性值 * 以后多运用setXxx getXxx 修改属性的值 */ import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class TestField { public static void m

C#修改属性的访问性

Type.GetProperty 方法 获取当前 Type 的特定属性. 参数 name String 包含要获取的属性名的字符串. bindingAttr BindingFlags 枚举值的按位组合,这些值指定如何进行搜索. 或 若为 Default,则返回 null. 返回 PropertyInfo 表示符合指定需求的属性的对象(如果找到的话):否则为 null. 示例 下面的示例检索用户定义的类的类型,检索该类的属性,并根据指定的绑定约束显示属性名称. using System; usin

PostgreSQL修改数据库表的列属性(ALTER语句)

一,修改表 PostgreSQL 提供了一族命令用于修改现有表. 可以实现: 增加字段, 删除字段, 增加约束, 删除约束, 修改默认值, 重命名字段, 重命名表. 这些操作可以用:ALTER TABLE命令执行的. 1,增加字段 要增加一个字段,使用这条命令: ALTER TABLE products ADD COLUMN description text; 新增的字段对于表中已经存在的行而言最初将先填充空值. 你也可以同时在该字段上定义约束,使用通常的语法: ALTER TABLE prod

Json.Net如何在序列化之前修改属性值

今天写一个Json.net比较偏门的用法,也许你很久都用不到,也许你明天就能派上用场. 我们都知道 Json.net 序列话的用法 Test test = new Test() { A = "123", B = DateTime.Now, C = DateTime.Now.AddDays(1) }; string json = JsonConvert.SerializeObject(test); 你会发现这一串的代码会生成如下的东西: {"A":"123&

转载自——Json.Net如何在序列化之前修改属性值

今天写一个Json.net比较偏门的用法,也许你很久都用不到,也许你明天就能派上用场. 我们都知道 Json.net 序列话的用法 Test test = new Test() { A = "123", B = DateTime.Now, C = DateTime.Now.AddDays(1) }; string json = JsonConvert.SerializeObject(test); 你会发现这一串的代码会生成如下的东西: 1 {"A":"12

postgresql修改最大连接数

1.合适的最大连接数 used_connections/max_connections在85%左右2.修改最大连接数postgresql最大连接数默认为1001)打开postgresql配置文件vim /var/lib/pgsql/9.4/data/postgresql.conf 2)修改最大连接数max_connections = 1003)重启postgresql服务在CentOS 6.x系统中service postgresql-9.4 restart 在CentOS 7系统中system

JS监控DOM的事件(内部插入、移除、修改属性等)!爽!

这可不是简单的 onclick.onchange,你对 DOM 进行内部插入.移除.属性修改等均会触发相应事件. DOM 事件列表: DOMAttrModified DOMAttributeNameChanged DOMCharacterDataModified DOMElementNameChanged DOMNodeInserted DOMNodeInsertedIntoDocument DOMNodeRemoved DOMNodeRemovedFromDocument DOMSubtree

HTML5修改属性

最近在学习关于前端的知识,只能从头开始慢慢学习.留个记录 <script type="text/javascript"> var datadata=document.getElementById(hell); alert("原内容为:"+datadata.innerHTML); datadata.innerHTML="zzzzzzz"; </script> innerHTML 属性用于获取或替换 HTML 元素的内容. 语