2013-03-05 61 views
0

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

问题是,如果正在对很多记录进行操作,则需要执行表扫描并逐个获取值,并且会在客户端和服务器之间引发大量流量。

有没有办法在一个单一的查询将涉及子查询而不是存储过程?我正在使用PostgreSQL 8.4。

回答

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 

这将完全的循环移动到服务器上,这应该是一个快一点。

相关问题