如何计算json对象数组中的实例?

时间:2019-06-13 20:33:13

标签: sql json postgresql

我有一些表,其中包含jsonb对象数组作为列:

| event_id | attendees                                                                                                                                    |
|----------|----------------------------------------------------------------------------------------------------------------------------------------------|
|        1 | [{"name": "john smith", "username": "jsmith"}, {"name": "jeff jones", "username": "jjones"}, {"name": "steve woods", "username": "swoods"}] |
|        2 | [{"name": "al williams", "username": "awilliams"}, {"name": "james lee", "username": "jlee"}, {"name": "bob thomas", "username": "bthomas"}] |
|        3 | [{"name": "doug hanes", "username": "dhanes"}, {"name": "stan peters", "username": "speters"}, {"name": "jane kay", "username": "jkay"}] |

我想获取每个事件的用户名与某个条件相匹配(例如,用户名以“ j”开头)的所有与会者的计数。

看着documentation,我真的找不到能用于jsonb对象数组的任何东西。我能看到的最接近的东西是 jsonb_array_elements 函数,但是它返回一个集合而不是单个值。像这样:

select event_id, count(jsonb_array_elements(attendees) ->> 'username') 
from events
where jsonb_array_elements(attendees) ->> 'username' like 'a%'
group by event_id

显然是行不通的。有什么东西可以返回此输出(每个事件以j开头的用户名数量):

| event_id | count |
|----------|-------|
|        1 |     2 |
|        2 |     1 |
|        3 |     1 |

1 个答案:

答案 0 :(得分:2)

好吧,只需将您的SQL逻辑分为两部分。

如下所示,您可以获得每个username的全部event_id

select
    event_id,
    jsonb_array_elements(attendees) ->> 'username' as user_name
from
    events;
 event_id | user_name 
----------+-----------
        1 | jsmith
        1 | jjones
        1 | swoods
        2 | awilliams
        2 | jlee
        2 | bthomas
        3 | dhanes
        3 | speters
        3 | jkay
(9 rows)

然后我们可以为event_id维计算json元素的一些统计数据,例如,您要获取username的每个event_id的{​​{1}}的编号}以诸如username之类的字符开头,完整的SQL为:

'j'