2016-09-15 53 views
0

我有一个表tbl_item,其中item_id是varchar。当我使用下面的查询时得到不同的结果。根据数据类型获取不同的结果集

  1. SELECT * FROM tbl_item其中ITEM_ID和100通过ITEM_ID
  2. SELECT * FROM tbl_item ITEM_ID '1' 和 '100' 通过ITEM_ID

顺序由于之间ITEM_ID数据类型是其中1之间顺序varchar所以查询2似乎是正确的,但产生错误的结果。它只列出item_id的项目1

为什么结果中会出现这种情况?

+2

应该返回'1','10'和'100'。但是,为什么你将id存储在一个varchar列?!?整数有什么问题? – jarlh

+1

这是因为当您将数字作为字符串存储时,您将通过字符串的排序方式进行排序和逻辑检查。用你的第一个查询,你得到一个隐式转换为int,所以结果可能是你所期望的。将数据存储在适当的数据类型中,并且此问题将自行修复。 –

+0

@jarlh ......在这个例子中,我使用item id作为1和100,但实际上它可以像11234xyz – Aamit

回答

0

帮助谢谢你们。我找到了完成这件事的正确方法。下面的查询最初给出了一些问题,不知道为什么,但现在它的工作原理。

select * from tbl_item where item_id>='1' and item_id<='100' order by item_id 
1

字符串比较与整数比较不一样。举例来说,这是当下令为字符串第100号的样子:

1 
10 
100 
11 
12 
. . . 

同样的事情与between发生。因为你在常量周围有单引号,数据库引擎决定你确实是字符串。所以,它将这些值解释为字符串。

大概,第一个是表达查询的正确方法。如果值是数字,则使用数字进行比较。

+1

一样添加到字符串排序方式和Gordon的正确答案。当在'1'和'100'之间使用时,字符串2,3,4,5,6,7,8和9将全部错过。 –

0

尝试另一个方法:

SELECT * FROM tbl_item WHERE item_id BETWEEN 1 AND 100 ORDER BY item_id::INT 
0

试试这个:

select * from tbl_item where item_id between 1 and 100 order by cast(item_id as int) 
+0

如果项目标识为字母数字,如1234xyz – Aamit

+0

,则铸件不起作用如果item_id是字母数字(SQL Server 2012或更高版本),则可以使用try_convert或try_cast, –

相关问题