Tsql 如何根据varchar列上基于数字的范围筛选器选择行?

Tsql 如何根据varchar列上基于数字的范围筛选器选择行?,tsql,casting,where-clause,Tsql,Casting,Where Clause,如果我有一个长度为30的varchar列: [SpecificCode]-->varchar(30)在名为[Item]的db表中 如果我必须查询这个表中的行以获得所有 具体代码介于789和15000之间 在TSQL中最快的选择方式是什么?(需要对长度为30的varchar字段进行范围测试) 应该是这样的: SELECT * FROM Item WHERE cast(Item.SepecificCode as integer) >= 789 and cast(Item.SepecificCo

如果我有一个长度为30的varchar列:

[SpecificCode]-->varchar(30)在名为[Item]的db表中

如果我必须查询这个表中的行以获得所有

具体代码介于789和15000之间

在TSQL中最快的选择方式是什么?(需要对长度为30的varchar字段进行范围测试)


应该是这样的:

SELECT *
FROM Item
WHERE cast(Item.SepecificCode as integer) >= 789 and cast(Item.SepecificCode as interger) <= 15000
选择*
从项目

其中cast(Item.SepecificCode为整数)>=789,cast(Item.SepecificCode为整数)假设列中充满了非数字垃圾,但没有小数

SELECT *
FROM Item
WHERE
    RIGHT('00' + Item.SpecificCode, 5) BETWEEN '789' and '15000'
    AND
    ISNUMERIC(Item.SpecificCode) = 1;
如果只是整数

SELECT *
FROM Item
WHERE
    CAST(Item.SpecificCode AS int) BETWEEN 789 and 15000;
如果也浮动:

SELECT *
FROM Item
WHERE
    CAST(Item.SpecificCode AS float) BETWEEN 789 and 15000
    AND
    FLOOR(CAST(Item.SpecificCode AS float)) = CAST(Item.SpecificCode AS int)

尝试强制sql将列读取为INT

SELECT * FROM Item WHERE Item.SepecificCode+0 between 789 and 15000;
如果该列上的任何索引都是usless,因为它们是为varchar数据而不是整数创建的,请尝试使用以下方法查看:

EXPLAIN SELECT * FROM Item WHERE Item.SepecificCode+0 between 789 and 15000;

列中还有哪些其他数据?如果只是数字,为什么?我不想提及它们,因为我认为这对我来说不是很必要。有必要给你一个正确的解决方案
EXPLAIN SELECT * FROM Item WHERE Item.SepecificCode+0 between 789 and 15000;