是否可以在不创建函数且不使用任何服务器端编程语言的情况下转换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}
Run Code Online (Sandbox Code Playgroud)
把它变成:
{1:[1,2,null,null],2:[3,4,7,null],3:[5,5,null,8]}
Run Code Online (Sandbox Code Playgroud)
Erw*_*ter 13
使用jsonb_populate_record()(或json_populate_record()for json)众所周知的行类型作为目标.您可以使用临时表来注册类型以供临时使用(如果您不能使用现有表或自定义复合类型):
CREATE TEMP TABLE obj(a int, b int, c int, d int);Run Code Online (Sandbox Code Playgroud)
然后:
SELECT t.id, d.*
FROM test t
, jsonb_populate_record(null::obj, t.data) d;Run Code Online (Sandbox Code Playgroud)
或者使用jsonb_to_record()(或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);Run Code Online (Sandbox Code Playgroud)
或者单独提取和投射每个字段:
SELECT id, (data->>'a')::int AS a, (data->>'b')::int AS b
, (data->>'c')::int AS c, (data->>'d')::int AS d
FROM test;Run Code Online (Sandbox Code Playgroud)
所有这三个工作json和jsonb一致好评.只需使用相应的功能变体.
有关:
| 归档时间: |
|
| 查看次数: |
3900 次 |
| 最近记录: |