json - Postgres 9.5 - 查询嵌套 JSON 元素的数组长度

标签 json postgresql postgresql-9.5

我有一个包含 JSON 字段的 Postgres 表,该字段标识与给定记录关联的图像。该字段的内容如下所示:

 {"photo-verification": 
   {"photos": [
     {"type": "photo-verification", "fileName": "4f35a880-e9a0-43f9-a31e-1bb8b765d04d", "mimeType": "image/jpeg", "createdBy": "jmlittm", "createdTs": "2016-06-20T20:25:39.706Z", "delFlag": false, "updatedBy": "jmlittm", "updatedTs": "2016-06-20T20:25:39.706Z"},
     {"type": "photo-verification", "fileName": "3a104d07-dc48-4f59-b83f-06cd35a21dae", "mimeType": "image/jpeg", "createdBy": "jmlittm", "createdTs": "2016-06-20T22:31:09.808Z", "delFlag": false, "updatedBy": "jmlittm", "updatedTs": "2016-06-20T22:31:09.808Z"}
     ]
   }
}

一条记录可以有 0 个或多个关联图像 - 如果没有图像,则整个字段将为空。我正在尝试编写一个查询来确定有多少图像与给定记录相关联。最终结果应该是计算有多少记录有一张图像,有多少记录不止一张。如果我查询 JSON 的顶层,如下所示:

select n.images->'photo-verification' from notes n;

我可以获得包含照片数组的内部 JSON,但如果我尝试更深入地挖掘,我将得不到任何结果。我的想法是我可以按照以下方式做一些事情

select array_length(n.images->'photo-verification'->'photos', 1) from notes n;

select json_array_length(n.images->'photo-verification'->'photos') from notes n;

但我最终遇到了错误,并提示我也许应该考虑转换。

我才刚刚开始深入研究 Postgres,所以我仍在尝试围绕查询语言的一些更精细的点进行思考。我将继续研究,但非常感谢有人可能提供的任何帮助或见解。

编辑:

所以,我想我可以通过创建一个只有“照片”JSON 并过滤掉所有空字段的 View 来简化问题:

CREATE VIEW photos as SELECT n.images->'photo-verification' as photo FROM notes.notes n where (n.images->'photo-verification')::text != '';

它起作用了,因为我现在有一个带有 JSON 列的 View ,如下所示:

   {"photos": [
     {"type": "photo-verification", "fileName": "4f35a880-e9a0-43f9-a31e-1bb8b765d04d", "mimeType": "image/jpeg", "createdBy": "jmlittm", "createdTs": "2016-06-20T20:25:39.706Z", "delFlag": false, "updatedBy": "jmlittm", "updatedTs": "2016-06-20T20:25:39.706Z"},
     {"type": "photo-verification", "fileName": "3a104d07-dc48-4f59-b83f-06cd35a21dae", "mimeType": "image/jpeg", "createdBy": "jmlittm", "createdTs": "2016-06-20T22:31:09.808Z", "delFlag": false, "updatedBy": "jmlittm", "updatedTs": "2016-06-20T22:31:09.808Z"}
     ]
   }

但是,如果我尝试

从照片中选择 json_array_length(photo);

我得到:

错误:无法获取标量的数组长度

如果我尝试

从照片中选择 json_array_length(photo->'photos');

我得到一堆空白记录。

我一定是在这里遗漏了一些东西......

最佳答案

create temp table t (id int, data json);
insert into t values 
(1, 
'{"photo-verification": 
   {"photos": [
     {"type": "photo-verification", "fileName": "4f35a880-e9a0-43f9-a31e-1bb8b765d04d", "mimeType": "image/jpeg", "createdBy": "jmlittm", "createdTs": "2016-06-20T20:25:39.706Z", "delFlag": false, "updatedBy": "jmlittm", "updatedTs": "2016-06-20T20:25:39.706Z"},
     {"type": "photo-verification", "fileName": "3a104d07-dc48-4f59-b83f-06cd35a21dae", "mimeType": "image/jpeg", "createdBy": "jmlittm", "createdTs": "2016-06-20T22:31:09.808Z", "delFlag": false, "updatedBy": "jmlittm", "updatedTs": "2016-06-20T22:31:09.808Z"}
     ]
   }
}'),
(2, 
'{"photo-verification": 
   {"photos": [
     {"type": "photo-verification", "fileName": "4f35a880-e9a0-43f9-a31e-1bb8b765d04d", "mimeType": "image/jpeg", "createdBy": "jmlittm", "createdTs": "2016-06-20T20:25:39.706Z", "delFlag": false, "updatedBy": "jmlittm", "updatedTs": "2016-06-20T20:25:39.706Z"}
     ]
   }
}')
;

select id, json_array_length(data->'photo-verification'->'photos')
from t;

或者,如果您对某个特定领域感兴趣:

select json_array_elements(data->'photo-verification'->'photos')->>'fileName' as fileName
from t;

关于json - Postgres 9.5 - 查询嵌套 JSON 元素的数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41085839/

相关文章:

javascript - 从 google apps 脚本上的 json 发布到 facebook

swift - 转换 ASCII 十进制

sql - 两列之间的天数 SQL

postgresql - 使用 Postgresql 和 Flask-SQLAlchemy 提高 COUNT(*) WHERE 的数据库性能

linux - 从 pg_basebackup 恢复

mysql - PostgreSQL SERIAL 与 MySQL AUTO INCREMENT?

安卓改造2 |从 JSON 响应中获取列表数据

ios - 将大量数据从核心数据导出到json

postgresql - 当pq_user中的valuntil值为NULL时,PostgreSQL用户密码多久会过期?

Java LibGDX 如何解析 JSON?