以最佳性能解压 JSONB 对象

unpack JSONB object with best performance

有没有简单的表达式或函数把"unpack"子对象分解成主对象?


举例说明:

SELECT '{"x":null,"A":{"foo":true,"bar":123},"B":2332}'::jsonb;  
-- = JSONB object with "A" as sub-object.

是一个典型的案例:我需要把"A"内容放到主对象中。并且需要保留数据类型 (number/boolean/null),没有 "convert string solution" 是有效的。也期待好的表现。

删除 "A" 可以用 - 'A',但是,放回它的内容,并不容易:

SELECT ('{"x":null,"A":{"foo":true,"bar":123},"B":2332}'::jsonb - 'A')
    || '{"foo":true,"bar":123}'::jsonb; -- aim result, unpacked!

SELECT ('{"x":null,"A":{"foo":true,"bar":123},"B":2332}'::jsonb - 'A')
    || ('{"A":{"foo":true,"bar":123}}'::jsonb)->'A' -- NOT WORKS...

如何放回"A"内容?

运算符||的优先级高于运算符->,因此您需要移动括号。我只将最后一个从 ::jsonb)->'A' 更改为 ::jsonb->'A') 并且有效:

SELECT 
    ('{"x":null,"A":{"foo":true,"bar":123},"B":2332}'::jsonb - 'A')
    || ('{"A":{"foo":true,"bar":123}}'::jsonb->'A');