我有一个表tbl_item,其中item_id是varchar。当我使用下面的查询时得到不同的结果。根据数据类型获取不同的结果集
- SELECT * FROM tbl_item其中ITEM_ID和100通过ITEM_ID
- SELECT * FROM tbl_item ITEM_ID '1' 和 '100' 通过ITEM_ID
顺序由于之间ITEM_ID数据类型是其中1之间顺序varchar所以查询2似乎是正确的,但产生错误的结果。它只列出item_id的项目1
为什么结果中会出现这种情况?
我有一个表tbl_item,其中item_id是varchar。当我使用下面的查询时得到不同的结果。根据数据类型获取不同的结果集
顺序由于之间ITEM_ID数据类型是其中1之间顺序varchar所以查询2似乎是正确的,但产生错误的结果。它只列出item_id的项目1
为什么结果中会出现这种情况?
帮助谢谢你们。我找到了完成这件事的正确方法。下面的查询最初给出了一些问题,不知道为什么,但现在它的工作原理。
select * from tbl_item where item_id>='1' and item_id<='100' order by item_id
字符串比较与整数比较不一样。举例来说,这是当下令为字符串第100号的样子:
1
10
100
11
12
. . .
同样的事情与between
发生。因为你在常量周围有单引号,数据库引擎决定你确实是字符串。所以,它将这些值解释为字符串。
大概,第一个是表达查询的正确方法。如果值是数字,则使用数字进行比较。
一样添加到字符串排序方式和Gordon的正确答案。当在'1'和'100'之间使用时,字符串2,3,4,5,6,7,8和9将全部错过。 –
尝试另一个方法:
SELECT * FROM tbl_item WHERE item_id BETWEEN 1 AND 100 ORDER BY item_id::INT
试试这个:
select * from tbl_item where item_id between 1 and 100 order by cast(item_id as int)
如果项目标识为字母数字,如1234xyz – Aamit
,则铸件不起作用如果item_id是字母数字(SQL Server 2012或更高版本),则可以使用try_convert或try_cast, –
应该返回'1','10'和'100'。但是,为什么你将id存储在一个varchar列?!?整数有什么问题? – jarlh
这是因为当您将数字作为字符串存储时,您将通过字符串的排序方式进行排序和逻辑检查。用你的第一个查询,你得到一个隐式转换为int,所以结果可能是你所期望的。将数据存储在适当的数据类型中,并且此问题将自行修复。 –
@jarlh ......在这个例子中,我使用item id作为1和100,但实际上它可以像11234xyz – Aamit