我们目前正在使用 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)