【问题标题】:Getting different resultset based on data type根据数据类型获取不同的结果集
【发布时间】:2016-09-15 19:28:08
【问题描述】:

我有一个表 tbl_item,其中 item_id 是 varchar。当我使用下面的查询 1 得到不同的结果。

  1. select * from tbl_item where item_id 介于 1 到 100 之间,按 item_id 排序
  2. 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

标签: sql sql-server mssql-jdbc


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2016-09-08
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多