【发布时间】:2013-03-13 15:06:28
【问题描述】:
您有一个字符串类型的列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 中有一个“开始于”的结构吗?我找不到任何相关信息。
-
是的,有
Where Foo like 'bar%'会启用索引。 -
LIKE 'pre%'不能在那些 DBMS 中使用索引,这很奇怪。至少在 SQL Server 中它是 sargable。
标签: sql arrays select indexing prefix