【问题标题】:NUMERIC and VARCHARNUMERIC 和 VARCHAR
【发布时间】:2015-02-01 18:00:29
【问题描述】:

我正在使用 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) 更改为数字,以便我可以正确排列它们?

非常感谢。

【问题讨论】:

  • 你到底为什么将数字存储在varchar 列中?这几乎总是一个糟糕的选择 - 您的问题说明了为什么这是一个坏主意的一个原因。
  • 除非您明确指定 ORDER BY 子句,否则NO ORDER 已定义 - 如果您需要订单 - 请指定!
  • 感谢您的回复。我想我在第二个查询中使用了 order by num asc 但它仍然返回了相同的结果。

标签: sql-server sqldatatypes


【解决方案1】:

当您使用 > '95' 时,它会按字母顺序比较“数字”,这就是结果是这样的原因。当您使用 > 95 时,它会将列转换为数字,这就是结果不同的原因。

要确定实际发生的情况,您应该自己进行强制转换。当然,您不应该将数字存储为 varchars。

正确的顺序是

按转换(int,num)排序

但如果表中有非数字字段,它将失败。

【讨论】:

  • 嗨,詹姆斯,感谢您的回复。如果第二个查询将 95 视为一个数字,那么为什么 96 不是结果中的第一个数字,还是因为我缺少 order by?此外,正如我们所知,这是 varchar(4) 数据类型,如果我想要所有小于 95 的数字,那么我会写... WHERE num
  • 顺序可以是任意的,除非你指定order by,但如果查询简单,通常是聚集索引的顺序。如果您需要将数字范围作为数字,请在 where 子句中使用 convert(int, num)
【解决方案2】:

> 对字符串而不是数字进行字典比较。所以输出是按字符串的顺序(按 ASC 排序)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多