查看有关JSON函数的postgres文档(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定义的记录类型匹配(参见下面的注释)。
底部的笔记似乎都不相关。我希望用示例代码更好地解释这一切。
答案 0 :(得分:2)
第2次通知是对doc感兴趣的通知,因为它解释了如何处理丢失的字段/值
注意:在json_populate_record中,json_populate_recordset,json_to_record 和json_to_recordset一样,从JSON中输入强制是“尽力而为” 并且可能不会导致某些类型的期望值。 JSON键是 与目标行类型中的相同列名匹配。 JSON字段 那些没有出现在目标行类型中的将被省略 输出和与任何JSON字段都不匹配的目标列 简单地说是NULL。
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)