Postgres 函数将两个具有重叠键的 json 对象合并为一个对象

max*_*hud 12 postgresql json

我有以下 JSON 对象:

{
    "a" : {
        "0" : 2,
        "1" : 4,
        "3" : 6,
    },
    "b" : {
        "2" : 8,
        "1" : 10, /*note this key exists in "a" too*/
        "4" : 12,
    }
}
Run Code Online (Sandbox Code Playgroud)

我想生成以下对象,然后能够像这样从中提取元素:

{
        "0" : 2,
        "1" : 10,
        "2" : 8,
        "3" : 6,
        "4" : 12,
}
Run Code Online (Sandbox Code Playgroud)

提取:object->>'1'应该返回'10'

基本上,我有两个键可能重叠的数组,我想合并这两个数组,给一个数组优先级。

我怎样才能做到这一点?理想情况下,我会调用一个类似的函数arrayMerge(a, b),它的'a'优先级高于'b'

Bru*_*uno 15

如果您使用的是 PostgreSQL 9.5(至少),您可以类型使用连接运算符 ( ||)jsonb(如果需要,您可以先转换jsonjsonb)。

例如:

WITH test(data) AS (
    VALUES ('{
        "a" : {
            "0" : 2,
            "1" : 4,
            "3" : 6
        },
        "b" : {
            "2" : 8,
            "1" : 10,
            "4" : 12
        }
    }'::jsonb)
)
SELECT (data->'a') || (data->'b') FROM test
Run Code Online (Sandbox Code Playgroud)

将产生:

{"0": 2, "1": 10, "2": 8, "3": 6, "4": 12}
Run Code Online (Sandbox Code Playgroud)

(请注意,在此特定示例中,括号很(data->'a')重要。)

您可以根据要求修改上面的示例以获取特定值,例如:

SELECT (((data->'a') || (data->'b'))->'1')::text::integer FROM test
Run Code Online (Sandbox Code Playgroud)