小编Tho*_*mas的帖子

PostgreSQL 9.4 深度合并 jsonb 值

要求和情况

我们目前正在使用 JSONB 列来加速我们数据库中的任意搜索,并且到目前为止工作正常。更新数据时,要求如下:

  • 任何新值都将覆盖任何现有值。这包括空值和数组。
  • 任何(嵌套)对象都将被合并。
  • 空值以及空数组和对象将被删除(如果它们存在的话)。

为了说明这一点,请考虑以下示例:

现有(为了说明目的包含空值):

{
  "a":null, 
  "b":1, 
  "c":1,
  "f":1, 
  "g": { 
     "nested": 1 
  }
}
Run Code Online (Sandbox Code Playgroud)

这应该合并到现有对象中:

{
  "b":2, 
  "d":null, 
  "e":2, 
  "f":null, 
  "g":{
    "nested": 2
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我们覆盖了一些字段并删除了f. 所以预期的输出是:

{
  "b": 2, //overridden
  "c": 1, //kept
  "e": 2, //added
  "g": {
    "nested": 2 //overridden
  }
}
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我们使用以下函数:

CREATE OR REPLACE FUNCTION jsonb_merge(jsonb1 JSONB, jsonb2 JSONB) 
RETURNS JSONB LANGUAGE sql IMMUTABLE
AS $$
  SELECT  
    CASE    
      WHEN jsonb_typeof($1) = 'object' AND jsonb_typeof($2) = 'object' THEN
        ( …
Run Code Online (Sandbox Code Playgroud)

postgresql json postgresql-9.4

5
推荐指数
1
解决办法
5929
查看次数

标签 统计

json ×1

postgresql ×1

postgresql-9.4 ×1