2011-06-21 92 views
1

這是一個有趣的事情,它只發生在一個數據庫文件,而不是與我有任何其他人。我解決了這個問題,但認爲這很有趣。Sqlite奇怪的排序順序

我有一個表 -

<partial table> 
CREATE TABLE [horsestats] (
[horseID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
[name] VARCHAR(30) NULL, 
[flatrating] INTEGER DEFAULT '0' NULL 
); 

所有在表中的零個值由默認值設定,其他任何已通過我的軟件設置。大約70%的記錄具有設定值。所以,如果我們運行這個 -

Select horsestats.flatrating FROM horsestats WHERE horsestats.flatrating<>0 ORDER BY horsestats.flatrating DESC LIMIT 20; 

我們真的不希望這樣 -

 
flatrating 
0 
0 
0 
etc 

其實只有0列值,但沒有說是不是零值都在輸出。如果我們反轉它,我們可能會期望只有不爲0的值被列出:

Select horsestats.flatrating FROM horsestats WHERE horsestats.flatrating=0 ORDER BY horsestats.flatrating DESC LIMIT 20; 

但是,沒有記錄返回。

那麼,這一個讓我們(這是我開始的地方,因爲它是第一套,我的軟件需求):

Select horsestats.flatrating FROM horsestats ORDER BY horsestats.flatrating DESC; 

我敢打賭,你的襪子,你猜錯了。它得到這個:

 
flatrating 
0 
0 
0 
0 
130 
128 
127 
126 
125 
124 
124 

正如我所說,這不會發生在我有任何其他數據庫或表。我現在要通過隱含地將零的所有值設置爲零來修復它,我懷疑這樣做是正確的。

事實上,它沒有,如果我跑:

UPDATE horsestats SET horsestats.flatrating='0' WHERE horsestats.flatrating='0'; 

問題仍然存在,所以它看起來像我必須編寫數據庫文件關閉的腐敗。在這種情況下,可以,因爲我必須從軟件的預加載中加載其他地方的大部分數據。

所以問題是爲什麼?

Sqlite可以做一個奇怪的混合的ansi和數字排序嗎?我唯一能想到的就是給出這個排序順序,但是這個表中的值零也不是數值上的零,儘管一旦它傳遞給我的軟件,它的行爲就像預期的那樣。

回答

0

我認爲你的問題是你引用了零 - 這使它成爲一個字符串。做一個這樣的表:

CREATE TABLE [horsestats] (
[horseID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
[name] VARCHAR(30) NULL, 
[flatrating] INTEGER DEFAULT 0 NULL 
); 

它似乎工作。或者,運行update命令的未加引號的版本:

UPDATE horsestats SET horsestats.flatrating=0 WHERE horsestats.flatrating='0';