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

时间:2020-06-29 23:21:22

标签: 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\": \"2\", \"c\": \"3\"}","{\"a\": \"4\", \"b\": \"5\", \"c\": \"6\"}","{\"a\": \"7\", \"b\": \"8\", \"c\": \"9\"}"} |
  

我如何:

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

我的困惑源于一个事实,即postgres中处理JSONB的所有方法似乎都接受JSON或JSONB,但似乎都无法与JSONB []一起使用。不确定我缺少什么?

预先感谢

1 个答案:

答案 0 :(得分:1)

有什么比用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';