到目前为止的答案未能解决您的问题:
但我想在查询中使用 Like、% 、 _ 等,以便我可以松散地匹配模式(不是全部 8 个字符)。
无论您使用LIKE
还是匹配整个字符串(并且字符串中=
没有通配符),这几乎没有任何区别。要使搜索模糊,您需要替换部分模式,而不仅仅是添加。
例如,要匹配 的最后 7 个(而不是 8 个)字符subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
我使用更简单的left()
(在 Postgres 9.1 中引入)。
您could
将其简化为:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
但是,如果您使用我在下面提到的特殊索引,您就不会这样做,因为功能索引中的表达式必须精确匹配才能使用。
您可能对扩展感兴趣pg_tgrm
。
在 PostgreSQL 9.1 中,每个数据库运行一次:
CREATE EXTENSION pg_tgrm;
两个原因:
它提供相似性算子%
。有了它,您可以构建智能相似性搜索:
--SELECT show_limit();
SELECT set_limit(0.5); -- adjust similarity limit for % operator
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) %
(SELECT subcolumn FROM subtable WHERE subid = 2);
它为两者提供索引支持LIKE
%
如果读取性能比写入性能更重要,我建议您创建一个功能性GIN 或 GiST 索引,如下所示:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable
USING gist (left(maincolumn, 8) gist_trgm_ops);
该索引支持任一查询。请注意,它会带来一些写入操作的成本。
此相关答案中类似案例的快速基准。