查询postgresql中以text数据类型存储的json数据

anauzrmj  于 2023-01-10  发布在  PostgreSQL
关注(0)|答案(2)|浏览(373)

我在tableA中有两个表tableA和表B json结构存储在以下格式的列中

{"action":"UPDATED","atime":1672914675,"category":"homes","ctime":1672915282,"uid":0,"hashed":1}

以及存储在tableB中文本列中的json数组,格式为

[{"description":"rooaa","uid":0,"user_name":opq}, {"description":"dassaon","uid":1,"user_name":oqqq}]

我想用tableA中的字段uid和tableB中的相应用户名进行连接操作,有人能告诉我如何操作吗?我只想连接tableB中的用户名,以获得tableA中的特定值uid。

zed5wv10

zed5wv101#

首先在CTE t1t2中扁平化tableAtableB的json字段-然后执行一个例程join。请注意,这种表设计效率极低,而且很难使用。

with t1 as 
(
 select jsonfield::json ->> 'uid' as uid, jsonfield::json as json_a from tablea
), 
t2 as 
(
 select json_b, json_b ->> 'uid' as uid, json_b ->> 'user_name' as user_name 
 from (select json_array_elements(jsonarr::json) json_b from tableb) as t
)
select uid, user_name, json_a, json_b 
from t1 
join t2 using (uid);

DB-小提琴demo

8i9zcol2

8i9zcol22#

试试这样的方法:

SELECT *
  FROM tableA AS a
 INNER JOIN 
     ( tableB AS b
       CROSS JOIN LATERAL jsonb_path_query(b.text_column :: jsonb, '$[*]') AS c(json_value)
     ) AS d
    ON a.text_column :: jsonb->'uid' = d.json_value->'uid'

相关问题