我需要使用一组非常复杂的规则来搜索一个大表(超过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
答案 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)
可能会提高性能,因为这样可以防止取消为没有找到匹配项的行添加标签。