根据数据类型获取不同的结果集

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

【讨论】:

以上是关于根据数据类型获取不同的结果集的主要内容,如果未能解决你的问题,请参考以下文章

JDBC处理大结果集

在union的时候怎么强制指定数据类型

oracle 如何返回多条记录

如何在java中合并来自两个不同数据库的两个不同结果集

如何利用百度地图获取一种类型POI的统计数据

ArcGIS遇上PythonArcGIS Python按照指定字段批量筛选不同类型的图斑(以土地利用数据为例)