如何使用Postgres中的json_populate_recordset解析JSON?

30

我在数据库的一行中存储了一段文本形式的JSON数据,其内容如下:

[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},{"id":67273,"name":"16167.txt"},{"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]

我将使用PostgreSQL方法解析这个内容

json_populate_recordset()

当我提交像以下这样的命令时:

select json_populate_recordset(null::json,'[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},{"id":67273,"name":"16167.txt"},{"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]') from anoop;

出现以下错误:json_populate_recordset的第一个参数必须是行类型。

注意:在from子句中,“anoop”是表名。

有没有人可以建议我如何使用json_populate_recordset方法从这个JSON字符串中提取数据。

我从http://www.postgresql.org/docs/9.3/static/functions-json.html中获得了该方法的参考资料。

2个回答

53

调用pgsql函数json_populate_recordset时,第一个参数应该是行类型。如果您想使用JSON数组填充现有表anoop,只需将表anoop作为行类型传递即可,如下所示:

insert into anoop
select * from json_populate_recordset(null::anoop, 
        '[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},
          {"id":67273,"name":"16167.txt"},
          {"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]');

在此,null 是要插入未在传递的json中设置的表列的默认值。
如果您没有现有的表格,则需要创建一个行类型来保存您的json数据(即列名称及其类型),并将其作为第一个参数传递,例如:anoop_type。请参考 创建类型
create TYPE anoop_type AS (id int, name varchar(100));
select * from json_populate_recordset(null :: anoop_type, 
        '[...]') --same as above

3
这是我找到的第一个用通俗易懂的语言解释null::anoop的答案。谢谢!话虽如此,我不明白null的价值,因为大多数记录都有许多数据类型。除了null之外,我们还可以为期望字符串、uuid和整数的记录提供哪些其他默认值? - Wellspring

21

不需要为此创建新类型。

select * from json_populate_recordset(null::record,'[{"id_item":1,"id_menu":"34"},{"id_item":2,"id_menu":"35"}]')
 AS
 (
    id_item int
    , id_menu int
 )

如果我从表中查询,而不使用创建类型,那么语法会是什么样子? - Souvik
错误:记录类型未被注册。 - Nishant Ghodke
当一个五年前的问题只有几周比我第一次访问晚的评论时,我总是感到很惊讶... - Wellspring

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