簡體   English   中英

Postgres 9.5-查詢嵌套JSON元素的數組長度

[英]Postgres 9.5 - Querying array length of a nested JSON element

我有一個Postgres表,其中包含一個JSON字段,該字段標識與給定記錄關聯的圖像。 該字段的內容如下所示:

 {"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並過濾掉所有空字段的視圖來簡化問題:

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

它起作用了,因為我現在有了一個帶有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"}
     ]
   }

但是,如果我嘗試

select json_array_length(photo) from photos;

我得到:

ERROR: cannot get array length of a scalar

如果我嘗試

select json_array_length(photo->'photos') from photos;

我得到了一堆空白記錄。

我一定在這里想念什么...

似乎需要轉換為JSON:

select json_array_length((images->'photo-verification'->'photos')::json)
from notes;
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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM