2015-10-18 23 views

回答

7

它的包容性。

由于任何以'd'开头并且长于1个字符的字符串都大于'd',所以您不会得到您想要的结果。例如'da' > 'd'。 因此,您的查询将返回以'a','b','c'和值'd'开头的所有值。

为了得到你想要使用

select * from tblprofile where firstname >= 'a' and firstname < 'e' 
+3

或者'select * from tblprofile',其中''ad'%''这样的名字也可以做到这一点(如果OP处于不区分大小写的排序规则) –

+0

使用正则表达式[ad]%结束,所以感谢Martin,你们其他人解释了为什么以前它不能正常工作!谢谢! – Eliseo

3

尝试()函数:

SELECT * 
FROM tblprofile 
WHERE LEFT(FirstName,1) between 'a' and 'd' 
+2

像这样在where子句中使用函数会忽略索引。 –

+0

谢谢Jakub。我同意你的答案更加优雅。出于好奇,忽视指标的影响会是什么? – Sergio

+1

它需要读取整个表格,而不是只查找符合条件的那些名称。在这种情况下,如果姓名在字母表中平均分布,则可能需要读取多达6或7倍的行。 –

0

另一种方法是使用工会选择这样

SELECT * FROM tblprofile结果WHERE LEFT(名字,1)= 'A' 工会 SELECT '从'tblprofile WHERE LEFT(FirstName,1)='b' union SELECT * FROM tblprofile WHERE LEFT(FirstName,1)='c' union SELECT * FROM tblprofile WHERE LEFT

使用联合的优点是,如果您需要获得结果用A,K和X表示,字符串无序。