最很长的匹配substring

问题描述 投票:0回答:1

您如何搜索varchar变量中最长的匹配?例如,表GOB的条目如下:

magic_word |  prize
===================
         sh|  $0.20
        sha|  $0.40
       shaz|  $0.60
      shaza|  $1.50
我想编写一个PLPGSQL函数,该函数以其他参数为输入(例如

shazam

),并返回GOB行上的“奖品”列,并具有最长的匹配子字符串。在所示的示例中,这将是在行上使用Magic_word
$1.50
我可以处理的所有功能格式,这只是匹配位。我想不出一个优雅的解决方案。我猜这可能真的很容易,但是我在挠头。我不知道一开始的输入字符串,因为它将是从另一个表上查询的结果得出的。 任何想法?
    

simple溶液

shaza

这是因为最长的匹配是最后的 - 所以我排序
postgresql plpgsql
1个回答
6
投票
并选择了第一场比赛。 我从您的示例中假设您想从字符串的开头匹配左锚定。如果您想在字符串中的任何地方匹配(这更昂贵,甚至更难用索引备份),请使用:

DESC
Fiddle

 -old
sqlfiddle

绩效
查询不是

如果您有其他信息,例如最小长度您可以基于索引,则可能会有所帮助,以减少要考虑的行数。它必须是使您不到桌子少的5%的标准才能有效。因此,首字母(自然的最低选项)可能会或可能没有用。但是一开始时有两个或三个字母可能会有所帮助。 实际上,您可以迭代地进行优化。沿线的东西:
步调单词的部分索引,用15个字母+ 如果找不到,请尝试12个字母+

如果找不到,请尝试9个字母+

...

我在DBA上的此相关答案中概述了一个简单的情况。 可以帮助空间索引帮助“范围 - 订单by -limit”查询

另一个方法是使用Trigram指数。为此,您需要其他模块
  • ... WHERE 'shazam' LIKE ('%' || magic_word || '%') ...
  • 。通常,您会在带有longer
  • 字符串的表格中使用简短的图案进行搜索。但是,Trigrams也有一些局限性也适用于您的反向方法。显然,您无法使用Trigrams在更长的字符串的中间只用两个字符匹配字符串...测试角案例。 这里有许多答案,因此还有更多信息。示例:
  • 在包含substring的列上有效查询

最很长的前缀匹配


如何
1

pg_trgm

© www.soinside.com 2019 - 2024. All rights reserved.