Извлечь результаты сопоставления из целочисленного массива, удовлетворяющего условию, заданному в виде текста

У меня есть массив целочисленных данных, хранящихся в определенном поле в пользовательской таблице. Этот массив представляет группы, в которые входит пользователь. Пользователь может иметь любое количество групп.

т.е.

Таблица: пользователь

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

Другие вопросы по тегам