微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Postgresql:两列之间的匹配模式

我有两列,分别是Main和Sub. (他们可以是同桌或不同).

Main是长度为20的varchar,Sub是长度为8的varchar.
Sub始终是Main的子集,它是Main的最后8个字符.

我可以使用substr(“Main”,13,8)成功设计一个匹配模式的查询

查询

select * from "MainTable"
 where substr("MainColumn",8) LIKE (
   select "SubColumn" From "SubTable" Where "SubId"=1043);

但我想在我的查询中使用Like,%,_ etc,以便我可以松散地匹配模式(不是所有8个字符).

问题是我该怎么做.?!

我知道下面的查询完全错误但我希望实现这样的目标,

Select * from "MainTable"
 Where "MainColumn" Like '%' Select "SubColumn" From "SubTable" Where "SubId"=2'

解决方法

到目前为止,答案未能解决您的问题:

but I want use Like,%,_ etc in my query so that I can loosely match
the pattern (that is not all 8 characters).

只要匹配整个字符串(并且字符串中没有通配符),使用LIKE或=几乎没有任何区别.要使搜索模糊,您需要替换部分模式,而不仅仅是添加模式.

例如,要匹配子列的最后7个(而不是8个)字符:

SELECT *
FROM   maintable m
WHERE  left(maincolumn,8) LIKE 
       ( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2),7));

我使用更简单的左()(Postgres 9.1引入).
您可以将其简化为:

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;

两个原因:

>它提供similarity operator %.有了它,你可以建立一个智能相似性搜索

--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和%提供index support

如果读取性能比写入性能更重要,我建议您创建一个functional GIN或GiST索引,如下所示:

CREATE INDEX maintable_maincol_tgrm_idx ON maintable
USING gist (left(maincolumn,8) gist_trgm_ops);

该索引支持任一查询.请注意,它会带来一些写入操作的成本.
A quick benchmark for a similar case in this related answer.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐