以最佳性能解压 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');
有没有简单的表达式或函数把"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');