我有一个整数列,我想搜索从1500开始的所有数字。
我知道我可以使用像left(accountid, 4)= 1500
这样的东西。
但这是一个最佳解决方案还是有更好的方法? 我正在使用SQL Server 2005。
答案 0 :(得分:3)
LEFT(CONVERT(varchar, accountid),4)="1500"
答案 1 :(得分:3)
INT是INT是INT - 它只是一个数值。 INT不会“看起来”像某个字符串值.....如果你想与LIKE比较,你需要一个字符串 - 你需要将你的INT转换成一个字符串才能做到这一点。
如果你需要搜索和比较你的INT的字符串表示很多,我建议你把它作为一个计算的,持久的列在你的桌子上:
ALTER TABLE dbo.YourTable
ADD IntString AS LEFT(CAST(YourInt AS VARCHAR(20)), 4) PERSISTED
这样,你得到一个新的列,里面有一个值,该值总是最新的,它是一个持久列,如果需要你可以索引它 - 你可以获得比较你的“int”与LIKE
运算符: - )
答案 2 :(得分:3)
如果您愿意交换存储空间以提高性能,我会在表中添加一个持久的计算列,包含整数的字符串版本,索引,并使用该列进行搜索。
答案 3 :(得分:2)
假设您知道列的最小值和最大值,则可以执行以下操作:
select
stuff
from
table
where
(number = 1500)
or (number >= 15000 and number <= 15009)
or (number >= 150000 and number <= 150099)
or (number >= 1500000 and number <= 1500999)
or (number >= 15000000 and number <= 15009999)
-- add however many statements you need.
或者,如果您不知道最小值和最大值,您可以这样做:
...
where
(number - 1500*POWER(10, FLOOR(LOG10(number) - 3)))
< (POWER(10, FLOOR(LOG10(number) - 3)))
答案 4 :(得分:1)
如果你想更进一步,为什么不创建类似帐户的超级类别,这将消除从整数转换varchar执行LEFT()的需要。为了澄清一下,如果你知道以id 1500开头的所有帐户都说是与销售相关的帐户,那么你可以为所有这些帐户设置1500的超级类别。这当然只适用于这种层次关系存在=)。
答案 5 :(得分:1)
这一切都取决于数据量。如果你正在谈论数百万条记录,那么使用left with convert将不会很快。最好的选择是有一个存储前四位数的计算列,你直接从它进行搜索将是最快的。但每次插入或更新都需要花费更多时间。所以这一切都取决于你要处理的行数。
HTH
答案 6 :(得分:0)
select columnname from dbo.TB
where CONVERT(varchar(20), columnname ) like '15'+'%'