2012-07-30 15 views
15

私は並べ替え/並べ替えに問題があり、必要なように動作しません。varcharフィールドを数字で並べ替える方法は?

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 

それを行うには?

+6

あなたは 'decimal'ではなく' varchar'を使っているようですね。 – 0b10011

+3

実際のテキストは '80.0 proc'ですか? – LittleBobbyTables

+0

はいvarchar、yes列にはテキストが含まれています:80.0 procなど – waza123

答えて

42

それは「PROC」のように見えますが、文字列(varcharフィールド)の値をダブルまたはフロートまたはキャストする列を変換します。それがそうであるならば、あなたは

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

ことによってそれをおそらく注文することができ、そのようなクエリが非常に遅くなることに注意してください、そして深刻な使用のためには、数値データを格納するための数値列を使用することをお勧めしますしてください。

+0

働いて、ありがとう! – waza123

+3

私は動作するとは思っていませんでしたが、[それは](http://sqlfiddle.com/#!2/e9c9d/4) –

+3

興味深いことに、'80 .0 proc 'を10進数に変換すると失敗すると思います。誰でも知っている理由は? – Bort

6

procのcolumnフィールドはVARCHARまたはCHARで、リテラル文字列として処理します(アルファベット順にソートします)。それは辞書的に注文しますので

は、

SELECT `proc` FROM `table` ORDER BY CAST(`proc` AS decimal) DESC; 
+0

いいですが、私はそれを変更することはできません、解決策が必要です。 – waza123

+0

倍精度浮動小数点数は、 "100.0 proc"のような英数字の値を保持できません。 – JJJ

+0

は動作しません。 –

1

テーブルデザインに根本的な問題があります。 VARCHAR列に'80.0 proc'などの値を使用する代わりに、REAL(またはデータに適した任意の数値型)の列に80.0を保持するだけです。動的変換はORDER BY式でのみ使用できますが、クエリのパフォーマンスが低下する可能性もあります。

は便利なようではありませんここにあなたのテキストに「 PROC」を追加し、それはまた、簡単な変換を行うことを防止することができます。

は驚くべきことに明らかに、convert(..., decimal)は末尾のゴミを無視することができ、(CHEの答えを参照してください)。あなたが一般的に頼りにするべきではありません。

documentation on this aspect of the conversionは特に明確ではありません。その動作が変更された場合

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

、あなたはおそらくreplace()を使用することができます。これは、例えば、(一般的に起こるでしょう)文字列/数値の限界を認識するように、そのセクションを読んで価値がありますこの場合は、' proc'を取り除くだけです。

もっと複雑なものについては、正規表現置換を使用して文字列の数値を抽出し、ソートする前に数値にキャストすることができますが、this is not supported out of the box in MySQLとそれはどちらにしても不器用になります:あなたの列のデータ型)。

従来のデータを処理するには、余分な列を追加して、(余分な正規表現を置き換えることができる言語で)外部プログラムを使用することができます。

関連する問題