Postgresql:两列之间的匹配模式
我有两列,分别是Main和Sub. (他们可以是同桌或不同).
Main是长度为20的varchar,Sub是长度为8的varchar. 我可以使用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' 解决方法
到目前为止,答案未能解决您的问题:
只要匹配整个字符串(并且字符串中没有通配符),使用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); 但是如果你使用我进一步提到的特殊索引,你就不会这样做,因为功能索引中的表达式必须精确匹配才能使用. 您可能对 在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); 该索引支持任一查询.请注意,它会带来一些写入操作的成本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |