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 中的元素是随机排序的,所以如果您(像我一样)搜索第一个元素,您可能会在每次查询时得到不同的答案。
以下查询解析 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 中的元素是随机排序的,所以如果您(像我一样)搜索第一个元素,您可能会在每次查询时得到不同的答案。