2011-02-03 10 views
21

データ型floatの1つの列から選択し、別の列にnvarcharとして挿入する必要があります。floatをキャストまたはnvarcharに変換しますか?

私はそれをキャストしてみました:cast([Column_Name] as nvarchar(50))

結果ではなく、10桁の番号(電話番号)の9.07235e+009ました。

このデータを正しくキャストまたは変換する方法を知っている人はいますか?

+6

電話番号(例: '数字'の一種です。一般的な経験則では、ある種の計算を計画している場合は、数字だけを格納します。もしあなたが保存しようとしている数字が決して操作を必要としないならば(それらの行に沿った更新や何かを除いて)、それらを何らかの並べ替えの文字列として保存する必要があります。 – syllogism

答えて

14

浮動小数点型の列に電話番号を格納している場合(これは悪い考えです)、おそらくすべての整数になり、nvarcharにキャストする前にintにキャストできます。

ので、代わりの:

select cast(cast(1234567890 as float) as nvarchar(50)) 
1.23457e+009 

あなたが使用します。

select cast(cast(cast(1234567890 as float) as int) as nvarchar(50)) 
1234567890 

は、これらの例では、最内cast(1234567890 as float)は、適切な列から値を選択するの代わりに使用されます。

私は本当に浮動小数点数に電話番号を格納しないことをお勧めします。
電話番号がゼロで始まる場合はどうなりますか?

select cast(0100884555 as float) 
100884555 

おっと!間違った電話番号を保存しました...

+0

算術オーバーフロー真 – RichardTheKiwi

+0

十分な、しかし、あなたは常にあなたが40億より大きい電話番号を持っている代わりにあればbigint型を使用することができます。いずれにせよ、STR機能はこの質問の前に私が知らなかったより良いオプションのように見えます! – Coxy

+0

北米では、電話番号は0から始まることはありませんが、丸め誤差は依然として問題になります。 – dan04

30

チェックSTRあなたはSELECT STR([Column_Name],10,0)のようなものを必要とします**これはSQL Serverのソリューションです。他のサーバーはドキュメントをチェックします。

+0

a1ex07ありがとうございました – Eugene

+5

助けてくれれば、私はあなたからの "+" /ベスト回答を期待しています:) – a1ex07

+3

注:STRは先行スペースを引き起こします。 例:SELECT '' + STR(123.0,10,0)+ 'B' の文字列 "A 123B" を与えます。 LTRIMまたはCONVERTを小数点以下に使用する必要があります。 – PMBjornerud

7

は、浮動小数点を使用して固定小数点精度の必要なデータを格納します。 この例は、浮動小数点数をNVARCHAR(50)に正しく変換する方法を示しています。また、浮動小数点数を精度データに使用することが悪い考えを示しています。

create table #f ([Column_Name] float) 
insert #f select 9072351234 
insert #f select 907235123400000000000 

select 
    cast([Column_Name] as nvarchar(50)), 
    --cast([Column_Name] as int), Arithmetic overflow 
    --cast([Column_Name] as bigint), Arithmetic overflow 
    CAST(LTRIM(STR([Column_Name],50)) AS NVARCHAR(50)) 
from #f 

出力

9.07235e+009 9072351234 
9.07235e+020 907235123400000010000 

あなたは第二の出力は、我々は、テーブルに格納しようとしたデータが「00000」で終了してもかかわらず、「10000」で終わることがあります。これは、floatデータ型が有効数字の固定数をサポートしているためです。これはそれほど拡張されていません。

-1

DECLARE @MyFloat [フロート]

SETの@MyFloat = 1000109360.050

はSELECTは(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(DECIMAL AS @MyFloat(38、18)を交換)、 ''、 ''))、 ''、 '。')

関連する問題