2016-09-15 121 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, –

相關問題