PostgreSQL:对JSONB数组类型进行筛选和聚合
考虑下表定义:PostgreSQL:对JSONB数组类型进行筛选和聚合,postgresql,postgresql-10,Postgresql,Postgresql 10,考虑下表定义: CREATE TABLE keys ( id bigint NOT NULL DEFAULT nextval('id_seq'::regclass), key_value jsonb[] NOT NULL DEFAULT ARRAY[]::jsonb[], ) 该表现在包含以下值: id | key_value ---|----------- 1 | {"{\"a\": \1\", \"b\": \&
CREATE TABLE keys
(
id bigint NOT NULL DEFAULT nextval('id_seq'::regclass),
key_value jsonb[] NOT NULL DEFAULT ARRAY[]::jsonb[],
)
该表现在包含以下值:
id | key_value
---|-----------
1 | {"{\"a\": \1\", \"b\": \"2\", \"c\": \"3\"}","{\"a\": \"4\", \"b\": \"5\", \"c\": \"6\"}","{\"a\": \"7\", \"b\": \"8\", \"c\": \"9\"}"} |
我如何:
b
的值不是2的所有行?我试过使用@>操作符提前感谢有什么能比使用
最不常用的
和正常的关系操作更好呢
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';
JSONB[]是一种数组类型,其中包含JSONB项,您需要使用数组函数/运算符从中提取项。为什么不存储为JSONB呢?不幸的是,它是一个已有的系统,已经有好几GB的数据。然后你会看到这个。是的,我用unnest实现了它。只是想知道是否有更好的方法?“我的困惑源于这样一个事实,即postgres中处理JSONB的所有方法似乎都接受JSON或JSONB,但没有一种方法能够处理JSONB[]”——这应该告诉你一些事情;)从长远来看,将它从
JSONB[]
转换为JSONB
会更容易