繁体   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