如果我有一个长度为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?
答案 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;