2015-12-26 2 views
1

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

т.е.

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

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 

(Pardon, оно должно было быть отношения 1-N). Мне нужно выполнить следующий запрос,

SELECT * from user where user_groups = ANY(x); 

где x будет текст ценности искусства, науки, безопасности, спорта. Итак, когда x = Искусство, возвращается результат harry. База данных, я использую Postgresql8.4

+1

ARE YOU ** действительно ** используя Postgres 8.4? Затем вам следует запланировать обновление до поддерживаемой и поддерживаемой версии *** ***. –

ответ

1

Вы можете использовать @> contains оператор:

SELECT * 
FROM Users 
WHERE user_groups @> (SELECT ARRAY[group_id] 
         FROM Groups 
         WHERE group_name = 'Arts') 

SqlFiddleDemo

EDIT:

Есть ли способ, с помощью которые я мог бы дисплей user_groups как {искусства, науки, безопасности}, вместо {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

+0

Есть ли способ, с помощью которого я мог бы отображать 'user_groups', например' {Arts, Science, Security} ', вместо' {1,2,3} '? – harry

+0

@harry См. Обновленный – lad2025

+1

Спасибо тонну. Это действительно сработало. Отличный ответ. – harry

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