Sql 在jsonb数组对象(和索引)中查询jsonb数组对象

Sql 在jsonb数组对象(和索引)中查询jsonb数组对象,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,您好,这个查询需要永远的时间(2-3分钟),我如何编写它,这样我就不必两次执行jsonb_数组_元素了!? 有没有办法在数组内部的数组中为“pid”字段编制索引 提前感谢可用于从jsonb列中搜索顶级键的键或键/值对 我试图重新编写您的查询以使其更具可读性。没有任何样本数据,很难验证,但与原始数据相比,它的性能如何?(我将jsonb_数组_元素((b->>b')::jsonb)更改为jsonb_数组_元素(bets->'b'),该元素应该已经是json而没有强制转换。) 对于索引部分,您可以尝试

您好,这个查询需要永远的时间(2-3分钟),我如何编写它,这样我就不必两次执行jsonb_数组_元素了!? 有没有办法在数组内部的数组中为“pid”字段编制索引

提前感谢

可用于从jsonb列中搜索顶级键的键或键/值对

我试图重新编写您的查询以使其更具可读性。没有任何样本数据,很难验证,但与原始数据相比,它的性能如何?(我将
jsonb_数组_元素((b->>b')::jsonb)
更改为
jsonb_数组_元素(bets->'b')
,该元素应该已经是json而没有强制转换。)


对于索引部分,您可以尝试以下方法
select
        picks ->> 'pid' as playerid, e.id,
        e.sportid, e.leagueid,
        e.islive, e.status,
        e.locationid, e.participants, em.bets
From
    sfbr.eventmarket em
        join sfbr.events e on em.eventid = e.id,
    jsonb_array_elements(em.bets) b,
    jsonb_array_elements((b->> 'b')::jsonb) picks
where (picks ->> 'pid') is not null
  and (picks ->> 'ec') is null
  and e.startdatetime > '2019-09-04 07:29:00.690834' and (picks ->> 'pid') in
                        ('1880686','1796512','1838464','851658','66675')
order by e.startdatetime desc;
with m as (
    select 
        eventid,
        bets,
        jsonb_array_elements(bets -> 'b') as picks
    from 
        sfbr.eventmarket
), em as (
    select
        eventid,
        bets,
        picks ->> 'pid' as pid, 
        picks ->> 'ec' as ec
    from 
        m
), e as (
    select 
        id,
        sportid,
        leagueid,
        islive,
        status,
        locationid,
        participants,
        startdatetime
    from 
        sfbr.events
)
select
    em.pid,
    e.*,
    em.bets 
from 
    em 
inner join 
    e on em.eventid = e.id
where
    em.pid is not null and 
    em.ec is null and 
    e.startdatetime > '2019-09-04 07:29:00.690834' and 
    em.pid in ('1880686','1796512','1838464','851658','66675')
order by 
    e.startdatetime desc;