SQL Server LIKE for Integer

时间:2010-05-27 21:02:17

标签: sql sql-server-2005

我有一个整数列,我想搜索从1500开始的所有数字。

我知道我可以使用像left(accountid, 4)= 1500这样的东西。

但这是一个最佳解决方案还是有更好的方法? 我正在使用SQL Server 2005。

7 个答案:

答案 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'+'%'