3

你有一列foo,某种字符串类型,在该列上有一个索引。您希望SELECT从表WHERE中的foo列具有前缀'pre'。显然,索引在这里应该可以提供帮助。

这是通过前缀搜索最明显的方法:

SELECT * FROM tab WHERE foo LIKE 'pre%';

不幸的是,这并没有得到优化以使用索引(至少在 Oracle 或 Postgres 中)。

但是,以下方法确实有效:

SELECT * FROM tab WHERE 'pre' <= foo AND foo < 'prf';

但是有没有更好的方法来实现这一点,或者有没有让上面的方法更优雅的方法?尤其是:

  • 我需要一个 from 'pre'to函数'prf',但这必须适用于任何基础排序规则。此外,它比上面更复杂,因为如果搜索 eg'prz'那么上限必须是'psa',依此类推。
  • 我可以将其抽象为存储的函数/过程并仍然命中索引吗?所以我可以写类似的东西... WHERE prefix('pre', foo);

感谢所有 DBMS 的答案。

4

2 回答 2

0

数据库在这里非常重要。碰巧 SQL Server 为like.

一种方法是做这样的事情:

where foo >= 'pre' and foo <= 'pre+'~'

'~' 具有可打印字符中最大的 7 位 ASCII 值,因此它基本上比其他任何东西都大。但是,如果您使用宽字符或非标准字符集,这可能是个问题。

您不能将其抽象为函数,因为使用函数通常会排除使用索引。如果您总是查看前三个字符,那么在 Oracle 中您可以在这三个字符上创建一个索引(称为“基于函数的索引”)。

于 2013-03-23T22:50:37.093 回答
-3

怎么样

select * from tab where foo between 'pre' and 'prf' and foo != 'prf'

这以相同的方式启用索引。RDBMS 一定很愚蠢,不能为此使用索引。

于 2013-03-23T23:08:53.090 回答