[英]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.