簡體   English   中英

查詢並依靠jsonb列

[英]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的列表並僅對那些符合您的條件的條目進行分組。 步驟如下:

  1. 獲取jsonb的陣列searchItems#>運營商,它會得到JSON對象在指定的路徑;
  2. 使用jsonb_array_elements()函數jsonb_array_elements()從步驟1檢索的元素列表,該函數將JSON數組擴展為一組JSON值;
  3. 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.

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