sql - 使用索引按字符串前缀选择

标签 sql arrays select indexing prefix

您有一个字符串类型的列 foo,该列有一个索引。您想要从表WHERESELECT 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/

相关文章:

php - 数据库时区

MySQL INSERT 使用多个表中的变量

python - 将多个数组值更改为一个值

java - 如何计算数组的中位数?

Javascript - 使用复选框输入返回动态行数据

php - 将包含字符串和数字的多维数组插入 MySQL

sql - 我们可以在 SELECT 和 FROM 之间写子查询吗

javascript - 如何在 JavaScript 中按照指定的正则表达式模式拆分数组

Mysql查询。更新、乘法、连接和选择(?)全部放在一起

JavaScript 全选按钮不起作用