从满足条件的整数数组中获取匹配结果,该条件以文本形式给出

时间:2015-12-26 11:45:55

标签: postgresql postgresql-8.4

我在用户表的特定字段中存储了一个整数数组。此数组表示用户所属的组。用户可以拥有任意数量的组。

表:用户

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将是文字值艺术,科学,安全,体育。 因此,当x = Arts时,将返回harry的结果。我使用的数据库是Postgresql8.4

1 个答案:

答案 0 :(得分:1)

您可以使用@> contains运算符:

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

SqlFiddleDemo

修改

  

有什么方法可以显示user_groups之类的   {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