我有两栏说Main
and Sub
。 (它们可以在同一张桌子上,也可以不在同一张桌子上)。
Main
是长度为 20 的 varchar 且Sub
是长度为 8 的 varchar。
Sub
is always的子集Main
它是最后 8 个字符Main
.
我可以成功地设计一个查询来匹配模式使用substr("Main",13,8)
Query:
select * from "MainTable"
where substr("MainColumn",13,8) LIKE (
select "SubColumn" From "SubTable" Where "SubId"=1043);
但我想在查询中使用 Like、% 、 _ 等,以便我可以松散地匹配模式(这不是全部 8 个字符)。
问题是我该怎么做。?!
我知道下面的查询是完全错误但我想实现这样的目标
Select * from "MainTable"
Where "MainColumn" Like '%' Select "SubColumn" From "SubTable" Where "SubId"=2'
到目前为止的答案未能解决您的问题:
但我想在查询中使用 Like、% 、 _ 等,以便我可以松散匹配
模式(并非全部 8 个字符)。
你是否使用几乎没有什么区别LIKE
or =
只要匹配整个字符串(并且没有通配符)in你的字符串)。为了使搜索变得模糊,你需要replace模式的一部分,而不仅仅是添加到模式中。
例如,要匹配最后 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 引入)。
You 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
and %
如果读取性能比写入性能更重要,我建议您创建一个功能性的GIN 或 GiST 索引如下:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable
USING gist (left(maincolumn, 8) gist_trgm_ops);
该索引支持任一查询。请注意,它会带来一些写入操作的成本。
此相关答案中类似案例的快速基准.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)