如何在postgres中使用json_populate_recordset解析json

ken*_*ala 12 postgresql json postgresql-9.3

我有一个json存储为我的一个数据库行中的文本.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"}]
Run Code Online (Sandbox Code Playgroud)

解析这个我想使用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;
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误json_populate_recordset的第一个参数必须是行类型

注意:在from子句中,"anoop"是表名.

任何人都可以建议我如何使用json_populate_recordset方法从这个json字符串中提取数据.

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

小智 24

传递给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"}]');
Run Code Online (Sandbox Code Playgroud)

这里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
Run Code Online (Sandbox Code Playgroud)

  • 这是我发现的第一个用简单英语解压 null::anoop 的答案。谢谢!也就是说,我不明白 null 的值,因为大多数记录都有多种数据类型。除了 null 之外,我们还可以为需要字符串、uuid 和 int 的记录提供哪些其他默认值? (3认同)

小智 15

无需为此创建新类型。

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
 )
Run Code Online (Sandbox Code Playgroud)