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 mWHERE left(maincolumn,8) liKE ( '%' || left((SELECT subcolumn FROM subtable WHERE subID = 2),7));
我使用更简单的左()(Postgres 9.1引入).
您可以将其简化为:
SELECT *FROM maintable mWHERE 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 % operatorSELECT *FROM maintable mWHERE left(maincolumn,8) % (SELECT subcolumn FROM subtable WHERE subID = 2);
>它为liKE和%提供index support
如果读取性能比写入性能更重要,我建议您创建一个functional GIN或GiST索引,如下所示:
CREATE INDEX maintable_maincol_tgrm_IDx ON maintableUSING gist (left(maincolumn,8) gist_trgm_ops);
该索引支持任一查询.请注意,它会带来一些写入 *** 作的成本.
A quick benchmark for a similar case in this related answer.
以上是内存溢出为你收集整理的Postgresql:两列之间的匹配模式全部内容,希望文章能够帮你解决Postgresql:两列之间的匹配模式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)