根据数据类型获取不同的结果集
Posted
技术标签:
【中文标题】根据数据类型获取不同的结果集【英文标题】:Getting different resultset based on data type 【发布时间】:2016-09-15 19:28:08 【问题描述】:我有一个表 tbl_item,其中 item_id 是 varchar。当我使用下面的查询 1 得到不同的结果。
-
select * from tbl_item where item_id 介于 1 到 100 之间,按 item_id 排序
select * from tbl_item where item_id between '1' and '100' order by item_id
由于 item_id 数据类型是 varchar,所以查询 2 似乎是正确的,但会产生错误的结果。它只列出 item_id 为 1 的项目
为什么结果会出现这种差异?
【问题讨论】:
应该返回“1”、“10”和“100”。但是为什么你将 id 存储在 varchar 列中?!?整数有什么问题? 这是因为当您将数字存储为字符串时,您将通过字符串的排序方式进行排序和逻辑检查。在您的第一个查询中,您将获得到 int 的隐式转换,因此结果可能是您所期望的。以正确的数据类型存储您的数据,此问题会自行解决。 @jarlh ......在示例中,我使用项目 ID 作为 1 和 100,但实际上它可能类似于 11234xyz 【参考方案1】:字符串比较与整数比较不同。例如,前 100 个数字作为字符串排序时的外观如下:
1
10
100
11
12
. . .
between
也发生了同样的事情。因为常量周围有单引号,所以数据库引擎确定您真正的意思是字符串。因此,它将值解释为字符串。
想必,第一种是表达查询的正确方式。如果值是数字,则使用数字进行比较。
【讨论】:
添加字符串排序方式和 Gordon 的好答案。在 '1' 和 '100' 之间使用时,字符串 2、3、4、5、6、7、8 和 9 都会丢失。【参考方案2】:尝试下一个方法:
SELECT * FROM tbl_item WHERE item_id BETWEEN 1 AND 100 ORDER BY item_id::INT
【讨论】:
【参考方案3】:试试这个:
select * from tbl_item where item_id between 1 and 100 order by cast(item_id as int)
【讨论】:
如果项目 id 是像 1234xyz 这样的字母数字,则投射将不起作用 如果 item_id 是字母数字(SQL Server 2012 或更高版本),您可以使用 try_convert 或 try_cast 【参考方案4】:感谢大家的帮助。我找到了完成这项工作的正确方法。下面的查询最初给出了一些问题,不知道为什么,但现在它可以工作了。
select * from tbl_item where item_id>='1' and item_id<='100' order by item_id
【讨论】:
以上是关于根据数据类型获取不同的结果集的主要内容,如果未能解决你的问题,请参考以下文章