如何在PostgreSQL中定义JSON的记录类型

4
查看postgres JSON函数文档(https://www.postgresql.org/docs/9.6/static/functions-json.html),有一节关于将JSON对象扩展为一组行的内容我不理解。
文档提供了这个函数的一个样例用法:json_populate_recordset(base anyelement, from_json json),如select * from json_populate_recordset(null::myrowtype, '[{"a":1,"b":2},{"a":3,"b":4}]') 但我不确定第一个参数(null::myrowtype)是什么——是表定义吗?
该函数的描述是:将from_json中最外层的对象数组扩展为一组行,其列与由base定义的记录类型匹配(见下面的注释)。
底部没有任何相关注释。我希望有更好的解释和示例代码来理解所有内容。

根据这个答案,看起来你可以在那个位置使用null::mytablename,但我不理解那个语法。 - amphetamachine
1个回答

5
第二个通知是doc中感兴趣的内容,因为它解释了如何处理缺少的字段/值。
注意:在json_populate_record、json_populate_recordset、json_to_record和json_to_recordset中,从JSON进行类型强制转换是“尽力而为”,对于某些类型可能无法得到期望的值。JSON键与目标行类型中的相同列名匹配。不出现在目标行类型中的JSON字段将从输出中省略,不匹配任何JSON字段的目标列将仅为空。 json_populate_recordset将json对象的名称映射到作为第一个参数给出的表中的列名。
create table public.test (a int, b text);

select * from json_populate_recordset(null::public.test, '[{"a":1,"b":"b2"},{"a":3,"b":"b4"}]');


 a | b
---+----
 1 | b2
 3 | b4
(2 rows)

--Wrong column name:
select * from json_populate_recordset(null::public.test, '[{"a":1,"c":"c2"},{"a":3,"c":"c4"}]');
 a | b
---+---
 1 |
 3 |
(2 rows)


--Wrong datatype:
select * from json_populate_recordset(null::public.test, '[{"a":1.1,"b":22},{"a":3.1,"b":44}]');

ERROR:  invalid input syntax for integer: "1.1"

或者,您可以在现有表中不使用列名/类型的情况下,在运行时定义列。

select * from json_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') as x(a int, b text);
 a |  b
---+-----
 1 | foo
 2 |
(2 rows)

--> 请注意默认类型转换会发生("2" 被映射为 2),缺失的字段会被忽略(第二条记录中的 b 字段),以及未定义的字段(c)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接