PostgreSQL:过滤和聚合 JSONB 数组类型

PostgreSQL: Filter and Aggregate on JSONB Array type

考虑以下 table 定义:

CREATE TABLE keys
(
    id bigint NOT NULL DEFAULT nextval('id_seq'::regclass),
    key_value jsonb[] NOT NULL DEFAULT ARRAY[]::jsonb[],
)

table 现在包含以下值:

id | key_value
---|-----------
1  | {"{\"a\": \", \"b\": \"2\", \"c\": \"3\"}","{\"a\": \"4\", \"b\": \"5\", \"c\": \"6\"}","{\"a\": \"7\", \"b\": \"8\", \"c\": \"9\"}"} |
  

我如何:

  1. Select b 的值不是 2 的所有行?我尝试使用 @> 运算符,
  2. 对于 returned 行,对于每个 key_value 对象,return c - a

我的困惑源于这样一个事实,即在 postgres 中处理 JSONB 的所有方法似乎都接受 JSON 或 JSONB,但 none 似乎与 JSONB[].不确定我错过了什么?

提前致谢

有什么比使用 unnest 和正常的关系操作更好的呢?

array 类型和 json 面对完美的关系集是可憎的。洞的第一条规则是,当你发现自己在一个洞里时,停止挖掘并爬出洞。

with unwind as (
  select id, unnest(key_value) as kvjson
    from keys
)
select id, (kvjson->>'c')::int - (kvjson->>'a')::int as difference
  from unwind
 where kvjson->>'b' != '2';