postgres 如何过滤 jsonb_agg() 的结果

postgres how to filter results of jsonb_agg()

以下查询解析 table 中的文本列以获得 'PO' 值。然后 returns 一个 table 有两列 - 'PO' 和 'DATA' 其中每个单元格基本上包含所有行数据作为 JSONB 对象:

select POed."PO", jsonb_agg(to_jsonb(POed)- 'PO') as "DATA"
from (
    select  * , 
        (case 
            when patd."Text" notnull
            then (regexp_match(patd."Text" , '^[0-9]{10}00'))[1]
            else null
        end) as "PO"
    from "pat_details" patd
    ) as POed
group by "PO"

一个更简单的例子是,如果我从 table:

开始
a b Text
1 2 xxx 453 yyy
4 5 www 453 www

结果如下所示,其中 DATA 的每个元素都是 json 个对象的列表:

PO DATA
453 [{"a": 1, "b":2},{"a": 4, "b":5}]

我想进一步过滤结果以显示所有“a”=4 的“PO”。我想是这样的:

WHERE "DATA" -> 0 -> 0."a" = "4" 

这会产生语法错误。 error/correct 的查询方式是什么?

注 1: WHERE "DATA"->0->>'a'='4' 会得到列表第一个元素具有的所有实例条件,但我是否必须对所有可能的元素重复查询?

答案是:

WHERE "DATA"@>'[{"a":"4"}]'

请注意,如果您像我一样尝试指定特定元素,您将 运行 遇到问题。看起来 jsonb 中的元素是随机排序的,所以如果您(像我一样)搜索第一个元素,您可能会在每次查询时得到不同的答案。