我想选择有一个名字以字母AD开头的所有值,但是当我做这个用于字符的语句之间的Microsoft SQL不具有包容性?
select * from tblprofile where firstname between 'a' and 'd'
我从A到C的所有值,不包括d,我怎么能保证它包括d?使用左
我想选择有一个名字以字母AD开头的所有值,但是当我做这个用于字符的语句之间的Microsoft SQL不具有包容性?
select * from tblprofile where firstname between 'a' and 'd'
我从A到C的所有值,不包括d,我怎么能保证它包括d?使用左
它的包容性。
由于任何以'd'开头并且长于1个字符的字符串都大于'd',所以您不会得到您想要的结果。例如'da' > 'd'
。 因此,您的查询将返回以'a','b','c'和值'd'开头的所有值。
为了得到你想要使用
select * from tblprofile where firstname >= 'a' and firstname < 'e'
尝试()函数:
SELECT *
FROM tblprofile
WHERE LEFT(FirstName,1) between 'a' and 'd'
像这样在where子句中使用函数会忽略索引。 –
谢谢Jakub。我同意你的答案更加优雅。出于好奇,忽视指标的影响会是什么? – Sergio
它需要读取整个表格,而不是只查找符合条件的那些名称。在这种情况下,如果姓名在字母表中平均分布,则可能需要读取多达6或7倍的行。 –
另一种方法是使用工会选择这样
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表示,字符串无序。
或者'select * from tblprofile',其中''ad'%''这样的名字也可以做到这一点(如果OP处于不区分大小写的排序规则) –
使用正则表达式[ad]%结束,所以感谢Martin,你们其他人解释了为什么以前它不能正常工作!谢谢! – Eliseo