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的所有行?我试过使用@>操作符
  • 对于返回的行,对于每个key_值对象,返回c-a
  • 我的困惑源于这样一个事实,即postgres中处理JSONB的所有方法似乎都接受JSON或JSONB,但似乎没有一种方法能够与JSONB[]一起工作。不知道我错过了什么


    提前感谢

    有什么能比使用
    最不常用的
    和正常的关系操作更好呢

    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
    会更容易