[英]Query and count on jsonb column
我是postgreSQL(9.5)Json世界的新手。 在編寫此查詢時尋求幫助。 以這個簡化表為例。
CREATE TABLE activity_log (uri varchar,
data jsonb );
“數據”列中的數據示例。
"{"ListingInputFilterBean":{"searchItems": [], "listingStatus": "ACTIVE"}"
"{"ListingInputFilterBean":{"searchItems": [{"name": "Dachshund", "type": "BREED"}], "listingStatus": "ACTIVE"}}"
"{"ListingInputFilterBean":{"searchItems": [{"name": "Lab", "type": "BREED"}, {"name": "Black Lab", "type": "CST"}], "listingStatus": "ACTIVE"}}"
“數據”列用於記錄每個URI調用的特定數據集。 在這種情況下,searchItems數組包含搜索中使用的項目。 我正在尋找一個查詢,以查找搜索最多的“品種”查詢。 我想計算類型為“ BREED”時使用每個“名稱”的次數。
我最初的方法是撤回每個“ searchItems”。 使用jsonb_to_recordset將它們轉換為行集,但是在閱讀文檔時我很快就陷入了困境(對不起,我是菜鳥)。
有關如何編寫該SQL的任何建議?
WITH log_activity(data) AS ( VALUES
('{"ListingInputFilterBean":{"searchItems": [], "listingStatus": "ACTIVE"}}'::JSONB),
('{"ListingInputFilterBean":{"searchItems": [{"name": "Dachshund", "type": "BREED"}], "listingStatus": "ACTIVE"}}'::JSONB),
('{"ListingInputFilterBean":{"searchItems": [{"name": "Lab", "type": "BREED"}, {"name": "Black Lab", "type": "CST"}], "listingStatus": "ACTIVE"}}'::JSONB)
)
SELECT search_item->>'name',count(search_item->>'name')
FROM
log_activity la,
jsonb_array_elements(la.data#>'{ListingInputFilterBean,searchItems}') as search_item
WHERE search_item->>'type' = 'BREED'
GROUP BY search_item;
結果:
name | count
-----------+-------
Lab | 1
Dachshund | 1
(2 rows)
在這里,您只需要遍歷searchItems
的列表並僅對那些符合您的條件的條目進行分組。 步驟如下:
jsonb
的陣列searchItems
用#>
運營商,它會得到JSON對象在指定的路徑; jsonb_array_elements()
函數jsonb_array_elements()
從步驟1檢索的元素列表,該函數將JSON數組擴展為一組JSON值; count()
名稱,其中searchItems的type
= BREED
,可以使用->>
運算符獲取實際文本值; 使用jsonb_to_recordset()
看起來更短,但是您需要顯式定義search_item
列的類型:
SELECT search_item.name ,count(search_item.name)
FROM
log_activity la,
jsonb_to_recordset(la.data#>'{ListingInputFilterBean,searchItems}') as search_item(name text,type text)
WHERE search_item.type = 'BREED'
GROUP BY search_item.name;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.