NUMERIC和VARCHAR

时间:2015-02-01 18:00:30

标签: sql-server sqldatatypes

我使用SQL Server 2008 R2来运行查询,我遇到了一个数据库,它将数值存储为varchar(4)。例如:

SELECT [num]
FROM  [TABLE1]
WHERE num > '95'

我得到以下结果

96
97
98
99
999

然而,当我在没有''的情况下运行相同的查询时即

SELECT [num]
FROM  [TABLE1]
WHERE num > 95

然后我得到

100
101
102
103
104
105
106
107
108
109
110
111
112
113
116
117
120
7001
7002
7003
7004
7005
7006
7007
96
97
98
99
999

在任何情况下,我都没有按顺序获得数字,即95,96,97,98,99。我理解这是因为它们存储为varchar(4),即字符串格式。请问有人可以解释两种情况下会发生什么,以及在上述两种情况下如何比较字符串?

此外,如果有人可以帮我编写代码以便将这些varchar(4)动态更改为数字,那么我可以正确安排它们吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

使用> ' 95'它比较"数字"按字母顺序排列,这就是结果如此的原因。当你使用> 95它的类型将列转换为数字,这就是为什么不同的结果。

为了确定实际发生了什么,你应该自己进行投射。当然,你不应该将数字存储为varchars。

正确的顺序是

  

按convert(int,num)

排序

但如果表格中有非数字字段,则会失败。

答案 1 :(得分:0)

>对字符串进行字典比较,而不是数字。因此输出按字符串顺序排列(按ASC排序)。