在varchar字段上使用BETWEEN而不是数字字段?

Evi*_*mes 4 sql coldfusion sql-server-2008 coldfusion-8

我正在使用ColdFusion 8和SQL Server 2008 R2.

我正在尝试查询一列值以获取值在一定范围内的行.该列应该是数字,但事实并非如此.它被设置为varchar(由其他人).有超过100,000行的数据.这是数据的FAKE样本:

ID COLUMN
1  1
2  1.2 
3  0.9 
4  5 
5  -6
Run Code Online (Sandbox Code Playgroud)

我的查询如下所示:

select column
from table
where column between 1 and 2
Run Code Online (Sandbox Code Playgroud)

此查询将不会运行,因为where语句的列是varchar,并且我得到转换错误,所以我必须将where语句更改为:

where column between '1' and '2'
Run Code Online (Sandbox Code Playgroud)

现在,当我运行这样的查询时,它会运行,但我没有得到结果.但我知道我应该看到结果,因为我知道列字段中的许多值都在我查询的范围内.

我想知道我是否看到没有结果,因为该字段是varchar而不是数字.可能会弄乱我的结果吗?

此外,我们正在搜索100,000多条记录,使用varchar字段而不是数字字段会有很大的性能影响吗?

Eli*_*ert 7

例如,您需要以结果WHERE ISNUMERIC(column) = 1 AND CAST(column AS decimal(10,5)) BETWEEN 1 AND 2为例.

  • 如果您确实需要搜索此数据,最好将其存储为数字.所有这些转换/转换对于SQL来说都是昂贵的.如果您无法编辑实际表,请考虑创建一个为您进行转换和转换的索引视图,以便您可以对其进行查询. (3认同)
  • 当然,`ISNUMERIC()= 1`是*no*保证列值可以转换为`decimal(s,p)`(对于`s`和`p`的任何值),SQL Server可能会重新-order操作使得它在检查*ISNUMERIC()`返回值之前尝试`CAST`. (2认同)