2011-06-21 4 views
1

ここで興味深いのは、1つのデータベースファイルでのみ起こっていることです。私はこの問題を解決しましたが、それはかなり興味深いと思いました。Sqliteの奇妙なソート順

私はテーブルを持っている -

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

テーブル内のゼロ値のすべては、デフォルト値で設定されている他は、私のソフトウェアによって設定されています。レコードの約70%に値が設定されています。だから、私たちはこの実行する場合 - 実際に

 
flatrating 
0 
0 
0 
etc 

のみ0である値がリストされ、ゼロでない値のいずれもしてません -

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

を私たちは本当にこのことを期待していません出力。これを逆にすると、0以外の値だけが表示されることがあります。

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

しかし、いいえ、返されるレコードはありません。

それでは、この1つは(それは私のソフトウェアのニーズ最初のセットであるので、これは、私が始めた場所です)私たちを取得ん:

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

することは私はあなたが間違っていると思い、あなたの靴下を賭けます。

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

これは私が持っている他のデータベースやテーブルでは起こりません。暗黙のうちに0の値をすべてゼロに設定することで修正するつもりです。これは正しいと思われます。私が実行した場合

は実際に、それは、ありませんでした:

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';