Postgres:如何查询`where(some_other_col_json_array)`中的id

时间:2016-11-21 20:07:51

标签: sql postgresql

我有两张特别的桌子。 userstagsusers表具有tagsjson列,其存储id到tags表的映射的引用。例如:

users
  .id        // Int
  .tags      // JSON array. Eg [1, 5, 9, 22, 64]

tags
  .id        // Int
  .tag_name  // String

我想获取给定用户ID的所有标签。以下伪postgres查询的东西:

select u.id, 
       u.first_name, 
       u.last_name, 
       array(select pt.tag_name from profile_tags pt where pt.id in (u.tags)) as p_tags
from users u
where u.id=$1

显然这不起作用,但我很乐意帮助实现这一目标。

1 个答案:

答案 0 :(得分:2)

您需要通过取消数组来规范化JSON,然后您可以加入并聚合:

select u.id, 
       u.first_name, 
       u.last_name, 
       array_agg(t.tag_name) 
from users u
  cross join lateral json_array_elements(u.tags) as ut(id)
  join tags t on t.id = ut.id::int
group by u.id, u.first_name, u.last_name;

如果你这么做很多,将标签引用存储在一个正确规范化的模型中很可能会更有效率。即使将标签ID存储在整数数组列中也会更容易,更有效。