首页 > 解决方案 > 查询在postgres jsonb中相交的json键

问题描述

我如何查询相交的 jsonb 键:

前任:

     kv                                 |        column1                   
-----------------------------------------------------------
[{"k1": "v1"}, {"k2": "v22"}]           | web
[{"k10": "v5"}, {"k9": "v21"}]          | mobile
[{"k1": "v1"}, {"k5": "v24"}]           | web1
[{"k5": "v1"}, {"k55": "v24"}]          | web1

在这里,第 1 行和第 3 行有 key k1,第 3 行和第 4 行有 key k5

所以,答案应该是第 1,3 和 4 行。

标签: sqlpostgresqljsonb

解决方案


你可以试试这个:

--This part is to simulate your table
with yourTable as (
select (string_to_array(t,'|'))[1]::jsonb kv,(string_to_array(t,'|'))[2] column1 from (
select unnest(string_to_array($$[{"k1": "v1"}, {"k2": "v22"}]           | web
[{"k10": "v5"}, {"k9": "v21"}]          | mobile
[{"k1": "v1"}, {"k5": "v24"}]           | web1
[{"k5": "v1"}, {"k55": "v24"}]          | web1$$::character varying,E'\n')) t

) b
) 
-- This is your request :
   select distinct kv,column1 from (
        select *,count(*) over (partition by elt) nb_inter from (
          select kv,column1,jsonb_object_keys(jsonb_array_elements(kv)) elt from yourTable
          ) a 
        ) b
where nb_inter >1

推荐阅读