逐步搜索最长前缀

时间:2014-11-21 19:15:37

标签: sql postgresql full-text-search pattern-matching prefix

我有一个包含电话号码前缀列的表格,如:

prefix
------
9379
355422
35566
...

给定一个电话号码,我想从右边开始删除它的数字,直到找到前缀列的第一个匹配。即:

937973418459
93797341845
9379734184
937973418
93797341
9379734
937973
93797
9379   <-- match found

请注意,我需要为电话号码列表执行此操作,因此批量操作很重要,而个别查询则很慢。我尝试使用postgres的全文搜索:

tsquery('937973418459|93797341845|9379734184|937973418|93797341|9379734|937973|93797|9379')

并且它有效,但在对抗10k电话号码时运行缓慢。有更有效的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

要查找 最长前缀

对于单个给定号码:

SELECT *
FROM   prefix_tbl
WHERE  937973418459 LIKE prefix || '%'
ORDER  BY prefix DESC
LIMIT  1

对于给定数字的整个表格:

SELECT DISTINCT ON (t.nr )
       p.*
FROM   prefix_tbl p
JOIN   tel_nr t ON t.nr LIKE p.prefix || '%'
ORDEr  BY t.nr, prefix DESC;

相关:

对于性能优化,请考虑这个与dba.SE密切相关的广泛答案:

而且: