0

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

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

有没有办法在涉及子查询但不涉及存储过程的单个查询中做到这一点?我正在使用 PostgreSQL 8.4。

4

1 回答 1

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

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

于 2013-03-05T16:03:55.720 回答