Postgres数组中至少两个重叠

时间:2019-04-17 12:33:26

标签: arrays postgresql

我需要使用一组非常复杂的规则来搜索一个大表(超过1亿条记录)。

目前我有一个像这样的表

CREATE TABLE equipment (
     id serial primary key,
     description varchar,
     code integer,
     tags varchar[]
)

我需要根据

进行查询

1)特定的代码列表(WHERE代码IN(1、4、5、8)

2)不在标签数组中的标签数组

3)标签数组位于标签数组中,但至少需要存在两个

SELECT * FROM equipment WHERE 
    code IN (1,3,6,7,8) 
    AND NOT ('{sports, outdoors, camping}' && tags)
    AND ('{tennis, squash, badminton, volleyball}' && tags)

但是我不知道如何使至少两个值(网球,壁球,羽毛球,排球)与标签数组重叠。

我正在使用Postgres 10.6

1 个答案:

答案 0 :(得分:1)

我认为您只能通过取消嵌套标签并计数标签来实现:

SELECT e.*
FROM equipment e
WHERE code IN (1,3,6,7,8) 
  AND NOT ('{sports, outdoors, camping}' && tags)
  AND EXISTS (SELECT 1
              FROM unnest(e.tags) x(tg)
              WHERE x.tg = any ('{tennis, squash, badminton, volleyball}')
              HAVING count(*) >= 2);

如果您在tags列上有索引,则可以使用AND('{网球,壁球,羽毛球,排球}'&&标记)保持当前状态:

AND ('{tennis, squash, badminton, volleyball}' && tags)

可能会提高性能,因为这样可以防止取消为没有找到匹配项的行添加标签。