您有一个字符串类型的列 foo
,该列有一个索引。您想要从表WHERE
中SELECT
foo
列具有前缀'pre'
。显然,索引应该能够在这里提供帮助。
这是最明显的前缀搜索方式:
SELECT * FROM tab WHERE foo LIKE 'pre%';
不幸的是,这并没有针对使用索引进行优化(至少在 Oracle 或 Postgres 中)。
但是,以下确实有效:
SELECT * FROM tab WHERE 'pre' <= foo AND foo < 'prf';
但是有没有更好的方法来完成这个,或者有没有办法让上面的代码更优雅?特别是:
- 我需要一个从
'pre'
到'prf'
的函数,但这必须适用于任何基础排序规则。此外,它比上面更复杂,因为如果搜索例如'prz'
那么上限就必须是'psa'
,依此类推。 - 我能否将其抽象为一个存储函数/过程并仍然命中索引?所以我可以写类似
... WHERE prefix('pre', foo);
?
感谢所有 DBMS 的答案。
最佳答案
数据库在这里很重要。碰巧 SQL Server 对 like
进行了这种优化。
一种方法是做这样的事情:
where foo >= 'pre' and foo <= 'pre+'~'
'~' 是可打印字符中最大的 7 位 ASCII 值,所以它基本上比其他任何字符都大。但是,如果您使用宽字符或非标准字符集,这可能会成为问题。
您不能将其抽象为一个函数,因为使用函数通常会排除索引的使用。如果您总是查看前三个字符,那么在 Oracle 中您可以为这三个字符创建索引(称为“基于函数的索引”)。
关于sql - 使用索引按字符串前缀选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15592702/