Postgresql:两列之间的匹配模式

Anu*_*tel 4 postgresql pattern-matching

我有两栏说MainSub。(它们可以在同一张桌子上,也可以不在同一张桌子上)。

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)

Erw*_*ter 5

到目前为止的答案无法解决您的问题:

但我想在查询中使用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)

两个原因:

  • 如果您使用GiST索引而不是GIN,则由相似性“ DESC”和“ LIMIT”排序的相似性搜索将使用索引的KNN搜索-索引实际上将以“最佳匹配”的顺序返回行。这可能比替代方法快得多。set_limit()中使用的值可能会对KNN搜索的性能产生重大影响,因此,请确保不包含过于“松散”而又没有真正意义的匹配项。(KNN是一种表示法,表示您希望“ k”个最近的邻居,其中“ k”是您提供的数字。) (3认同)