gpt4 book ai didi

postgresql - 如何在 postgres 中为 JSON 定义记录类型

转载 作者:行者123 更新时间:2023-11-29 12:09:33 25 4
gpt4 key购买 nike

查看 JSON 函数的 postgres 文档 ( https://www.postgresql.org/docs/9.6/static/functions-json.html ),有一个部分我不理解关于将 JSON 对象扩展为一组行。

文档给出了此函数的示例用法:json_populate_recordset(base anyelement, from_json json) as select * from json_populate_recordset(null::myrowtype, '[{"a":1 ,"b":2},{"a":3,"b":4}]')

但我不确定第一个参数 (null::myrowtype) 是什么——表定义?

这个函数的描述是:将from_json中最外层的对象数组扩展为一组行,这些行的列与base定义的记录类型相匹配(见下面的注释)。

底部的注释似乎都不相关。我希望通过示例代码得到更好的解释以理解这一切。

最佳答案

第二个通知是对 doc 感兴趣的通知因为它解释了如何处理缺失的字段/值

Note: In json_populate_record, json_populate_recordset, json_to_record and json_to_recordset, type coercion from the JSON is "best effort" and may not result in desired values for some types. JSON keys are matched to identical column names in the target row type. JSON fields that do not appear in the target row type will be omitted from the output, and target columns that do not match any JSON field will simply be 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)

关于postgresql - 如何在 postgres 中为 JSON 定义记录类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43875992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com