如何在postgres

时间:2017-05-09 17:10:58

标签: postgresql

查看有关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定义的记录类型匹配(参见下面的注释)。

底部的笔记似乎都不相关。我希望用示例代码更好地解释这一切。

1 个答案:

答案 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)