如何在varchar列上针对基于数字的RANGE过滤器选择行?

时间:2011-12-02 10:14:55

标签: tsql casting where-clause

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

[SpecificCode] - >名为[Item]

的db表中的 varchar(30)

如果我必须查询此表行以获取具有

的所有行

SpecificCode 介于789和15000之间

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

SELECT *
FROM Item
WHERE Item.SepecificCode --how to filter between 789 and 15000?

3 个答案:

答案 0 :(得分:2)

假设该列充满了非数字垃圾但没有小数

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)

答案 1 :(得分:0)

这将是这样的:

SELECT *
FROM Item
WHERE cast(Item.SepecificCode as integer) >= 789 and cast(Item.SepecificCode as interger) <= 15000

但为了提高性能,您应该在SepecificCode列中创建index

答案 2 :(得分:0)

尝试强制sql将列读作INT

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

AFAIK你在该列上的任何索引都是无用的,因为它们是为varchar数据创建的而不是整数,请尝试使用:

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