2017-02-10 13 views
0

私のSQLデータベースではVARCHARで価格がありますが、価格で注文しようとすると問題があります。 このクエリを使用しようとしましたが動作しません..!価格は、VARCHARからDECIMALへ

CAST(price AS DECIMAL) DESC 

私はこのクエリを起動した場合は、結果の順序は次のとおりです。

1.123,45 
122,00 
2.543,21 
656,00 
etc 
+2

あなたは、あなたがこの問題を持っていることは決してないだろう、と開始するには、正しいデータ型を使用する必要があります。 "動作しません"は問題の説明ではありません。それはエラーを投げますか?もしそうなら、エラーは何ですか?予期しない結果が出ていますか?もしそうなら、あなたは何を期待していますか? – HoneyBadger

+1

データベースに数値をvarcharとして格納する場合、これは通常、列に表示用にフォーマットされた文字列が含まれているためです。データベースはその内容に気づかず、その計算を何もしないことになっています。データベースで計算するために何か必要な場合は、代わりに数値を格納します。 –

+1

おそらく、小数点が10進数の代わりに期待されます。 – jarlh

答えて

0

使用

cast(replace(Price, ',', '.') as decimal(9,2)) 
+0

私には良く見えません。変更の対象となる小数点記号には、常にカンマを使用する書き込みプロセスが必要です。また、数字にさらに1000個の区切り文字が含まれている場合はどうすればよいでしょうか?次に、データベース設定に依存して小数点区切り文字を変更することがあります。私は、値が書かれている値とそのように知られている完全な形式(つまり、いくつかのアプリやビジネス層)をソートしたり、代わりに番号を格納することが最善のアドバイスだと思っています。 –

+0

@ThorstenKettnerもちろん、数値を数値として格納するのが最も賢明な解決策です。私は何千ものセパレータを考慮していなかった。 – JohnHC

0
...その後、精度とスケールでそれをキャストし、小数点を作成するために置き換えます

そのまま直接 "変換"を使用できます。

ORDER BY convert([name column], decimal)

0

私はこの問題を見つけました。数字は999,99ヘクタールです。 例: 1.000,00 すべてを交換しました。このクエリで:

UPDATE computers SET prezzo = REPLACE(prezzo, '.', '') 
+1

文字列の書式を自由に変更できるのであれば、そのデータ型を変更できないのはなぜですか?これは解決策になりますが、あなたが示していることは回避策以上のものではありません。 –

0

bolowごとに一つの例を作成します。 varchar型の価格でソート

insert into table1 values(1, '10.1'); 
insert into table1 values(1, '100.1'); 
insert into table1 values(1, '20.1'); 
insert into table1 values(1, '200.1'); 

を:

はvarchar型にレコードの価格を挿入し、テーブル

create table table1(
id integer, 
price varchar(20) 
) 

を作成します。数字フィールドごとに:

SELECT * FROM `table1` order by cast(replace(price, ',', '.') as decimal(9,2)) 
0

あなたのカンマが千単位の区切り文字である場合、空の文字列で置き換える必要があると思います。カンマが小数点区切り文字の場合、小数点に置き換える必要があります。

あなたのカンマが桁区切りある場合は、これを試してみてください:

SELECT 
    price 
FROM 
    prices 
ORDER BY 
    CAST(REPLACE(price,',','') AS DECIMAL) 

これはあなたを与える必要があります。

price 
543,21 
123,45 
1,001 
6,00 
2,00 

をごコンマはこの後、小数点の記号ある場合:

SELECT 
    price 
FROM 
    prices 
ORDER BY 
    CAST(REPLACE(price,',','.') AS DECIMAL) 

が得られますあなた:

price 
543,21 
123,45 
6,00 
2,00 
1,001 
0

これをチェックしてください。ここで

select * ,REPLACE(price, ',', '') from money 
order by CAST(REPLACE(price,',','') AS DECIMAL) 

チェックデモ:Link

関連する問題