2016-11-21 2 views
0

У меня есть две конкретные таблицы, с которыми я работаю. users и tags. Таблица users имеет столбец tags типа json, который хранит ссылки на сопоставление идентификатора на таблицу tags. Например:Postgres: Как запросить `where id in (some_other_col_json_array)`

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

tags 
    .id  // Int 
    .tag_name // String 

Я хочу получить все теги для данного идентификатора пользователя. Что-то любит следующий запрос псевдо 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 

Очевидно, что это не работает, но я хотел бы некоторую помощь, чтобы это право.

+3

Выполняйте нормализацию, и ваша проблема исчезнет. –

+2

http://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary-jsonhstore-dynamic-columns/ –

ответ

2

Вы должны нормализовать JSON на unnesting массив, то вы можете присоединиться и агрегатный:

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; 

Если вы сделаете это много, хранение ссылок тегов в правильной нормализованной модели будет наиболее вероятно, более эффективны. Даже сохранение идентификаторов тегов в столбце целочисленного массива уже было бы проще и эффективнее.

Смежные вопросы