20

並べ替え/並べ替えに問題があり、必要なように機能しません。

SELECT `proc` FROM `table` ORDER BY `proc` DESC;

結果:

80.0 proc
70.0 proc
60.0 proc
50.0 proc
40.0 proc
200.0 proc
20.0 proc
190.0 proc
180.0 proc
170.0 proc
160.0 proc
150.0 proc
140.0 proc
130.0 proc
120.0 proc
110.0 proc
100.0 proc

私が必要なのは:

200.0 proc
190.0 proc
180.0 proc
170.0 proc
160.0 proc
150.0 proc
140.0 proc
130.0 proc
120.0 proc
110.0 proc
100.0 proc
90.0 proc
80.0 proc
70.0 proc
60.0 proc
50.0 proc
40.0 proc
20.0 proc

どうやってするの ?

4

4 に答える 4

50

"proc" は文字列 (varcharフィールド) のように見えるので、字句順に並べられます。もしそうなら、あなたはおそらくそれを注文することができます

SELECT `proc` FROM `table` ORDER BY convert(`proc`, decimal) DESC;

このようなクエリは非常に遅くなることに注意してください。真剣に使用する場合は、数値データを格納するために数値列を使用することをお勧めします。

于 2012-07-30T20:02:55.673 に答える
8

proc の列フィールドは VARCHAR または CHAR であり、アルファベット順にソートされたリテラル文字列として扱われます。

列を double または float に変換するか、値をキャストします

SELECT `proc` FROM `table` ORDER BY CAST(`proc` AS decimal) DESC;
于 2012-07-30T20:01:32.050 に答える
1

テーブルの設計に根本的な問題があります。列のよう'80.0 proc'に値を使用する代わりに、タイプの列(またはデータに適した適切な数値型) を保持する必要があります。式でのみ使用するために動的変換を行うこともできますが、これもクエリのパフォーマンスを低下させる可能性があります。VARCHAR80.0REALORDER BY

ここでテキストに「 proc 」を追加することは役に立たないようです。また、単純な変換を行うこともできなくなります。

驚くべきことに ( cheの回答を参照)、どうやらconvert(..., decimal)末尾のごみを無視できるようです。ただし、一般的に頼るべきものではありません。

変換のこの側面に関するドキュメントは特に明確ではありません。そのセクションを読んで、文字列/数値の制限 (一般的に発生する) を認識しておくことをお勧めします。次に例を示します。

mysql> SELECT '18015376320243459' = 18015376320243459;
        -> 0

その動作が変更された場合、おそらくreplace()この場合、単に を取り除くために使用できます' proc'

より複雑なものについては、正規表現の置換を使用して文字列から数値を抽出し、並べ替えの前に数値にキャストすることもできますが、これは MySQL ではそのままではサポートされておらず、いずれにせよかなり扱いにくいものになります (修正してください)。その原因の問題: 列のデータ型)。

レガシー データを処理するには、追加の列を追加し、(正規表現の置換が可能な任意の言語で) 外部プログラムを使用できますが、これはそれほど難しくありません。

于 2012-07-30T20:11:08.950 に答える