Tre*_*ney 8 postgresql json 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"}
]
}
}
Run Code Online (Sandbox Code Playgroud)
一条记录可以有 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 的视图并过滤掉所有空字段来简化问题:
CREATE VIEW photos as SELECT n.images->'photo-verification' as photo FROM notes.notes n where (n.images->'photo-verification')::text != '';
Run Code Online (Sandbox Code Playgroud)
它起作用了,因为我现在有一个带有 JSON 列的视图,如下所示:
{"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"}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试
select json_array_length(photo) from photos;
我得到:
ERROR: cannot get array length of a scalar
如果我尝试
select json_array_length(photo->'photos') from 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;
Run Code Online (Sandbox Code Playgroud)
或者,如果您对某个特定领域感兴趣:
select json_array_elements(data->'photo-verification'->'photos')->>'fileName' as fileName
from t;
Run Code Online (Sandbox Code Playgroud)
似乎需要转换为 JSON:
select json_array_length((images->'photo-verification'->'photos')::json)
from notes;
Run Code Online (Sandbox Code Playgroud)