gpt4 book ai didi

postgresql - 如何将 postgresql 9.4 jsonb 转换为没有函数/服务器端语言的对象

转载 作者:行者123 更新时间:2023-11-29 11:15:50 24 4
gpt4 key购买 nike

是否可以在不创建函数且不使用任何服务器端编程语言的情况下转换 postgresql 9.4 jsonb 数据?

CREATE TABLE test (id SERIAL PRIMARY KEY,data JSONB);
INSERT INTO test(data) VALUES('{"a":1,"b":2}');
INSERT INTO test(data) VALUES('{"a":3,"b":4,"c":7}');
INSERT INTO test(data) VALUES('{"a":5,"b":5,"d":8}');
SELECT * FROM test;
id | data
----+-------------------------
1 | {"a": 1, "b": 2}
2 | {"a": 3, "b": 4, "c": 7}
3 | {"a": 5, "b": 5, "d": 8}

将其转化为:

 {1:[1,2,null,null],2:[3,4,7,null],3:[5,5,null,8]}

最佳答案

使用 jsonb_populate_record() (或 json_populate_record() for json)以众所周知的行类型作为目标。您可以使用临时表注册一个类型以供临时使用(如果您不能使用现有表或自定义复合类型):

CREATE TEMP TABLE <b>obj</b>(<b>a int, b int, c int, d int</b>);

然后:

SELECT t.id, d.*
FROM test t
, jsonb_populate_record(null::<b>obj</b>, t.data) d;

或者使用 jsonb_to_record() (或 json_to_record() for json)并在调用中提供列定义列表:

SELECT t.id, d.*
FROM test t
, jsonb_to_record(t.data) d(<b>a int, b int, c int, d int</b>);

分别提取和转换每个字段:

SELECT id, (data<b>->>'a'</b>)::int AS a, (data<b>->>'b'</b>)::int AS b
, (data<b>->>'c'</b>)::int AS c, (data<b>->>'d'</b>)::int AS d
FROM test;

这三个都适用于 jsonjsonb。只需使用相应的函数变体即可。

相关:

关于postgresql - 如何将 postgresql 9.4 jsonb 转换为没有函数/服务器端语言的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27181980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com