对表列运行最长匹配前缀的最佳方法是什么?

时间:2013-03-05 15:52:09

标签: sql postgresql longest-prefix

我需要针对表中的列运行最长匹配前缀,而不仅仅是单个值。对于单个值,我使用类似SELECT value, prefix as lmp FROM aTable WHERE SUBSTRING(value,1, LENGTH(prefix)) = prefix ORDER BY prefix DESC limit 1的内容。

问题是,如果它是针对许多记录进行的,则需要进行表扫描并逐个获取值,并且会在客户端和服务器之间产生大量流量。

有没有办法在单个查询中执行它,这将涉及子查询但不涉及存储过程?我正在使用PostgreSQL 8.4。

1 个答案:

答案 0 :(得分:1)

您可以使用CTE将值放在表格中并执行:

with list as (
    select 'abc' as prefix union all
    . . .
)
select value, lmp
from (SELECT value, prefix as lmp,
             row_number() over (partition by value order by len(prefix) desc) as seqnum
      FROM aTable join
           list l
           on SUBSTRING(value,1, LENGTH(prefix)) = prefix
     ) t
where seqnum = 1

这会将循环完全移到服务器上,这应该会快一些。