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

2023-11-26

是否可以在不创建函数且不使用任何服务器端编程语言的情况下转换 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]}

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

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

Then:

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

Or use jsonb_to_record() (or json_to_record() for json)并通过调用提供列定义列表:

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

Or提取并投射每个领域单独:

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

这三个人都为json and jsonb一样。只需使用相应的函数变体即可。

有关的:

  • 具有 JSON 数据类型中的嵌套记录数组的查询组合
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在没有函数/服务器端语言的情况下将 postgresql 9.4 jsonb 转换为对象 的相关文章

随机推荐