Anu*_*tel 4 postgresql pattern-matching
我有两栏说Main和Sub。(它们可以在同一张桌子上,也可以不在同一张桌子上)。
Main是长度为20 Sub的varchar,长度为8的varchar。始终
Sub是的子集,并且是的后8个字符。MainMain
我可以成功设计一个查询来匹配使用模式 substr("Main",13,8)
查询:
select * from "MainTable"
where substr("MainColumn",13,8) LIKE (
select "SubColumn" From "SubTable" Where "SubId"=1043);
Run Code Online (Sandbox Code Playgroud)
但我想在查询中使用Like,%,_等,以便可以轻松地匹配模式(不是全部8个字符)。
问题是我该怎么做?!
我知道下面的查询是完全错误的,但是我想实现这样的目标,
Select * from "MainTable"
Where "MainColumn" Like '%' Select "SubColumn" From "SubTable" Where "SubId"=2'
Run Code Online (Sandbox Code Playgroud)
到目前为止的答案无法解决您的问题:
但我想在查询中使用Like,%,_等,以便可以轻松地匹配模式(不是全部8个字符)。
它使你是否使用几乎没有任何差别LIKE或=只要你整个字符串匹配(并且没有通配符在您的字符串)。为了使搜索变得模糊,您需要替换部分模式,而不仅仅是添加它。
例如,要匹配的最后7个(而不是8个)字符subcolumn:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Run Code Online (Sandbox Code Playgroud)
我使用了更简单的方法left()(Postgres 9.1引入)。
您可以将其could简化为:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用我在后面进一步提到的特殊索引,则不会,因为功能索引中的表达式必须精确匹配才能使用。
您可能对扩展名感兴趣pg_tgrm。
在PostgreSQL 9.1中,每个数据库运行一次:
CREATE EXTENSION pg_tgrm;
Run Code Online (Sandbox Code Playgroud)
两个原因:
它提供相似性运算符%。有了它,您可以构建智能的相似度搜索:
--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);
Run Code Online (Sandbox Code Playgroud)它提供索引支持两个LIKE和%
如果读取性能比写入性能更重要,建议您创建一个如下的功能性 GIN或GiST索引:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable
USING gist (left(maincolumn, 8) gist_trgm_ops);
Run Code Online (Sandbox Code Playgroud)
该索引支持任一查询。请注意,写入操作会带来一些成本。
此相关答案中类似情况的快速基准。