你有一个foo
列,有一些字符串类型,在该列上有一个索引。您希望SELECT
表WHERE
foo
列中的'pre'
列前缀为SELECT * FROM tab WHERE foo LIKE 'pre%';
。显然,索引应该能够在这里提供帮助。
以下是按前缀搜索的最明显方式:
SELECT * FROM tab WHERE 'pre' <= foo AND foo < 'prf';
不幸的是,这并没有针对使用索引进行优化(至少在Oracle或Postgres中)。
然而,以下 工作:
'pre'
但有没有更好的方法来实现这一目标,还是有办法让上述更优雅?特别是:
'prf'
到'prz'
的函数,但这必须适用于任何基础排序规则。而且,它比上面更复杂,因为如果搜索例如'psa'
然后上限必须是... WHERE prefix('pre', foo);
,依此类推。感谢所有DBMS的答案。
答案 0 :(得分:0)
数据库在这里非常重要。事实上,SQL Server对like
进行了优化。
一种方法是做这样的事情:
where foo >= 'pre' and foo <= 'pre+'~'
&#39;〜&#39;具有可打印字符的最大7位ASCII值,因此它基本上比其他任何东西都大。但是,如果您使用宽字符或非标准字符集,则可能会出现问题。
您无法将其抽象为函数,因为使用函数通常会排除索引的使用。如果你总是查看前三个字符,那么在Oracle中你可以为这三个字符创建一个索引(称为&#34;基于函数的索引&#34;)。
答案 1 :(得分:-3)
怎么样
select * from tab where foo between 'pre' and 'prf' and foo != 'prf'
这使索引的方式相同。 RDBMS必须非常愚蠢不才能使用索引。