您如何搜索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
这是因为最长的匹配是最后的 - 所以我排序
DESC
Fiddle
-oldsqlfiddle
绩效查询不是
如果您有其他信息,例如最小长度您可以基于索引,则可能会有所帮助,以减少要考虑的行数。它必须是使您不到桌子少的5%的标准才能有效。因此,首字母(自然的最低选项)可能会或可能没有用。但是一开始时有两个或三个字母可能会有所帮助。
实际上,您可以迭代地进行优化。沿线的东西:
步调单词的部分索引,用15个字母+
如果找不到,请尝试12个字母+
我在DBA上的此相关答案中概述了一个简单的情况。 可以帮助空间索引帮助“范围 - 订单by -limit”查询
另一个方法是使用Trigram指数。为此,您需要其他模块
...
WHERE 'shazam' LIKE ('%' || magic_word || '%')
...
如何 1
pg_trgm