Извлечь результаты сопоставления из целочисленного массива, удовлетворяющего условию, заданному в виде текста
У меня есть массив целочисленных данных, хранящихся в определенном поле в пользовательской таблице. Этот массив представляет группы, в которые входит пользователь. Пользователь может иметь любое количество групп.
т.е.
Таблица: пользователь
user_id | user_name | user_groups
---------+-------------+-------------
1 | harry | {1,2,3}
2 | John | {4,5,6}
Таблица: группы
group_id | group_name
------------+--------------
1 | Arts
2 | Science
3 | Security
4 | Sports
(Простите, это должны были быть отношения 1-N). Мне нужно выполнить запрос следующим образом,
SELECT * from user where user_groups = ANY(x);
где x
будут текстовые значения Искусство, Наука, Безопасность, Спорт. Итак, когда х = искусство, результат harry
возвращается База данных, которую я использую Postgresql8.4
1 ответ
Ты можешь использовать @> contains
оператор:
SELECT *
FROM Users
WHERE user_groups @> (SELECT ARRAY[group_id]
FROM Groups
WHERE group_name = 'Arts')
SqlFiddleDemo
РЕДАКТИРОВАТЬ:
Есть ли способ, с помощью которого я мог бы отображать группы пользователей, такие как {Arts,Science,Security}, вместо {1,2,3}
Вы можете использовать коррелированный подзапрос:
SELECT user_id, user_name, (SELECT array_agg(g.group_name)
FROM Groups g
WHERE ARRAY[g.group_id] <@ u.user_groups) AS user_groups
FROM Users u
WHERE user_groups @> (SELECT ARRAY[group_id]
FROM Groups
WHERE group_name = 'Arts')
SqlFiddleDemo2