我需要针对表中的列运行最长匹配前缀,而不仅仅是单个值。对于单个值,我使用类似SELECT value, prefix as lmp FROM aTable WHERE SUBSTRING(value,1, LENGTH(prefix)) = prefix ORDER BY prefix DESC limit 1
的内容。
问题是,如果它是针对许多记录进行的,则需要进行表扫描并逐个获取值,并且会在客户端和服务器之间产生大量流量。
有没有办法在单个查询中执行它,这将涉及子查询但不涉及存储过程?我正在使用PostgreSQL 8.4。
答案 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
这会将循环完全移到服务器上,这应该会快一些。