我正在创建一个查询,该查询应返回以0-9或a-z开头的标题,具体取决于请求的内容。我在title
列上有一个索引,所以对于我正在做的各个字母:
SELECT * FROM table WHERE title LIKE 'a%';
SELECT * FROM table WHERE title LIKE 'b%';
SELECT * FROM table WHERE title LIKE 'c%';
/* etc... */
但是,对于这些数字而言,它的数字并不重要,只关注第一个字符是数字。我想要这样的东西:
SELECT * FROM table WHERE title LIKE '0%'
OR title LIKE '1%';
OR title LIKE '2%';
OR title LIKE '3%';
/* etc... */
但这感觉有点草率。据我所知,正则表达式对索引不会很好,我不确定字符串函数。像WHERE SUBSTRING(title,1,1) IN (0,1,2,3,4,5,6,7,8,9)
这样的东西是否仍然可以利用索引,还是有更紧凑的方法来做到这一点?
答案 0 :(得分:5)
如果你的字符都是“ASCII”,那么你可以这样做:
'9'
这应该可以使用索引。
我承认其含义有点难以捉摸,但冒号是{{1}}之后的第一个ASCII字符。
答案 1 :(得分:1)
@Gordon是正确的,因为所有ascii字符串都在'0'和':'之间
对于带字母的查询也是如此,'a'和'{'之间的所有字符串都匹配。
关于问题的第二部分,如果WHERE SUBSTRING(title,1,1) IN (0,1,2,3,4,5,6,7,8,9)
将使用索引,则答案为否。当索引中的列用于函数SUBSTRING
时,它必须将函数应用于表中的所有值,始终进行全表扫描。