更改或过滤到连接表的`column = ANY()`比较和过滤

时间:2017-03-22 06:45:40

标签: sql postgresql join filter postgresql-9.5

所以我有一张用户表和另一张爱好表。我创建了一个这样的查询:

SELECT DISTINCT
    usr.id,
    usr.name,
    usr.gender
FROM usr
LEFT JOIN hobby ON hobby.usr_id = usr.id
WHERE %(hobbies)s IS NULL OR hobby.id = ANY(%(hobbies)s)

我通过将值传递给%(hobbies)s来调用:如果没有提供业余爱好过滤器,则为NULL,或者用作过滤器的业余爱好ID列表。

这样可行,但它最终成为一个“或”过滤器,根据他们的爱好选择用户。例如,如果hobbies = [<football_id>, <basketball_id>],那么用户 篮球足以作为他的爱好。

我想要的是上述内容,但用户需要所有%(hobbies)s列表中提供的爱好。我该怎么做?

1 个答案:

答案 0 :(得分:2)

我建议使用数组

例如比较数组:

select array[1,2,3] = array[1,2,3]; // TRUE
select array[1,2,3] = array[1,2,5]; // FALSE

并包含其他数组中的数组:

select ARRAY[1,4,3] @> ARRAY[3,1] // TRUE
select ARRAY[1,4,3] @> ARRAY[1,2,4] // FALSE

您的查询:

SELECT
    usr.id,
    usr.name,
    usr.gender
FROM usr
where (select array(select h.id from hobby h where h.usr_id = usr.id)) @> (select array[1,2,3])