使用索引按字符串前缀SELECT

时间:2013-03-23 22:13:23

标签: sql arrays select indexing prefix

你有一个foo列,有一些字符串类型,在该列上有一个索引。您希望SELECTWHERE 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);,依此类推。
  • 我可以将其抽象为存储的函数/过程并仍然可以访问索引吗?所以我可以写一些像{{1}}?
  • 这样的东西

感谢所有DBMS的答案。

2 个答案:

答案 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必须非常愚蠢才能使用索引。