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\"}"} |
我如何:
- Select
b
的值不是 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';
考虑以下 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\"}"} |
我如何:
- Select
b
的值不是 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';