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

Sql 如何计算json对象数组中的实例数?,sql,json,postgresql,Sql,Json,Postgresql,我有一些表,其中包含一个列形式的jsonb对象数组: | event_id | attendees | |----------|-------------------------------------------------------

我有一些表,其中包含一个列形式的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”开头)的所有与会者的计数

看一下,我真的找不到任何可以用于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开头的用户名计数):


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

如下所示,您可以获得每个
事件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\u id
维度计算json元素的一些统计数据,例如,您想要得到每个
event\u id
username
的编号,其
username
以一些字符开头,例如
'j'
,完整的SQL应该是:

with tmp as (
select
    event_id,
    jsonb_array_elements(attendees) ->> 'username' as user_name
from
    events
)
select
    event_id,
    count(1)
from
    tmp
where
    user_name like 'j%'
group by
    event_id
order by
    event_id;
 event_id | count 
----------+-------
        1 |     2
        2 |     1
        3 |     1
(3 rows)
with tmp as (
select
    event_id,
    jsonb_array_elements(attendees) ->> 'username' as user_name
from
    events
)
select
    event_id,
    count(1)
from
    tmp
where
    user_name like 'j%'
group by
    event_id
order by
    event_id;
 event_id | count 
----------+-------
        1 |     2
        2 |     1
        3 |     1
(3 rows)