SQL Serverでfloatをvarcharに変換する方法


130

異なる長さの数値を持つfloat列があり、それらをvarcharに変換しようとしています。

一部の値がbigintの最大サイズを超えているため、このようなことはできません

cast(cast(float_field as bigint) as varchar(100))

10進数を使用しようとしましたが、数値が同じサイズではないため、これも役に立ちません

CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))

どんな助けでもありがたいです。

更新:

サンプル値は2.2000012095022E + 26です。


cast(float_field as varchar(max))それ以外の場合、質問はありません
Denis Valeev

5
キャストの値は2.2e + 026です。おそらくあなたは質問を受けません:)
hgulyan

回答:


246

STR()関数を使用してみてください。

SELECT STR(float_field, 25, 5)

STR()関数


別のメモ:これは左側にスペースを埋めます。これが問題である場合は、以下と組み合わせてLTRIMください。

SELECT LTRIM(STR(float_field, 25, 5))

3
*************************を受け取りました。あれは何でしょう?:)
hgulyan

4
@hgulyan- Select LTRIM(Str(float_field, 38, 0))あなたのデータのために働きますか?
マーティン・スミス

@Martin Smith、それは動作するようですが、10進数と同じ方法なので、それが実際の値であるかどうかはわかりません(最後の10桁はゼロです)。本当の価値は失われたと思います。ありがとうございました!
hgulyan

2
@hgulyan-最後の10桁はゼロStrです。これは、関数の最後のパラメーターがゼロであるためです。小数点以下の桁数。私が投稿したリンクを読みましたか?ゼロを10に変更します。 Select LTRIM(Str(float_field, 38, 10))
codingbadger

4
私は「!最初に我々は(文字列)をLTRIMスマート十分ではないテキストに誤フロート電話フィールドを変換する際に、科学的表記法で素敵な電話番号を取得するために調製することが、ちょっと」SSMSに警告があったことを望みます...
pkExec

42

正確に同じ元の数値を返す唯一のクエリビットは、

CONVERT (VARCHAR(50), float_field,128)

http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.htmlを参照してください

上記の他の解決策では、末尾に数字を丸めるか追加することがあります

更新:以下のコメントに従って、https//msdn.microsoft.com/en-us/library/ms187928.aspxで確認できる内容:

CONVERT (VARCHAR(50), float_field,3)

新しいSQL Serverバージョンで使用する必要があります(Azure SQLデータベース、およびSQL Server 2016 RC3以降)


2
@adinasの+1の場合、float値はそのまま変換されますが、float値はとして0変換され0.0E0ます。私はにfloatフィールドを変換するために必要なvarchar、私は表示する必要があるとNAする場合NULL0そのまま。CASE以下のようにクエリにステートメントを追加することでこれを実現しました。 CASE WHEN float_field IS NULL THEN 'NA' WHEN float_field = 0 THEN '0' ELSE CONVERT(VARCHAR, float_field, 128) END AS float_As_VChar
fujiFX 2015年

2
マイクロソフトの文書によると- msdn.microsoft.com/en-us/library/ms187928.aspx、128構文は、レガシーの理由で含まれており、将来のバージョンでdepreceatedすることができる
マイク・ターナー

1
128は非推奨ですが、最新のSQL Serverリリースでは3がその代わりになっているようです。
user3524983

13

これは私がsqlserver 2012で最終的に使用したソリューションです(他のすべての提案には、小数部を切り捨てるという欠点または他のいくつかの欠点があるため)。

declare @float float = 1000000000.1234;
select format(@float, N'#.##############################');

出力:

1000000000.1234

これには(私の場合)数千のセパレータとローカリゼーションを容易にするという利点があります。

select format(@float, N'#,##0.##########', 'de-DE');

出力:

1.000.000.000,1234

3

役立つトピックに感謝します。

私のように先頭のゼロを削除したい場合は、それを使用できます:

DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(STR(@MyFloat, 38, 16), '0', ' '))), ' ', '0'),'.',' ')),' ',',')

2

フロートには最大値しかありません。15桁の精度。したがって、15位以降の桁はランダムであり、bigint(最大19桁)または10進数への変換は役に立ちません。


わかりません。フィールド値は2.2000012095022E + 26です。解決策は何ですか?ありませんか?
hgulyan 09/10/15

元の値に保存されている数字よりも多くの数字を文字列に変換して取得することはできません。
devio

それで、私は15位の後に数字を失ったのですか?
hgulyan 09/10/15

データになんらかの問題がありました。15桁の浮動小数点数でその値を更新するだけです。このデータで私が抱えていた主な問題を説明しているので、私はあなたの答えを受け入れます。ありがとうございました。
hgulyan

2

これは丸めなしで役立ちます

declare @test float(25)

declare @test1 decimal(10,5)

select @test = 34.0387597207
select @test
set @test1 = convert (decimal(10,5), @test)
select cast((@test1) as varchar(12))


Select  LEFT(cast((@test1) as varchar(12)),LEN(cast((@test1) as varchar(12)))-1)

2

integer最初に変換してからstring

cast((convert(int,b.tax_id)) as varchar(20))

これにより、小数点以下の桁があれば削除されます。したがって、このソリューションは正確ではありません。
RushabhG 2017

2

これを試してください、うまくいくはずです:

cast((convert(bigint,b.tax_id)) as varchar(20))

1

CLR関数を使用する場合、フロートをフロートのように見える文字列に変換できます。最後に余分な0はありません。

CLR関数

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
[return: SqlFacet(MaxSize = 50)]
public static SqlString float_to_str(double Value, int TruncAfter)
{
  string rtn1 = Value.ToString("R");
  string rtn2 = Value.ToString("0." + new string('0', TruncAfter));

  if (rtn1.Length < rtn2.Length) { return rtn1; } else { return rtn2; }
}

create table #temp (value float)
insert into #temp values (0.73), (0), (0.63921), (-0.70945), (0.28), (0.72000002861023), (3.7), (-0.01), (0.86), (0.55489), (0.439999997615814)

select value,
       dbo.float_to_str(value, 18) as converted,
       case when value = cast(dbo.float_to_str(value, 18) as float) then 1 else 0 end as same
from   #temp

drop table #temp

出力

value                  converted                  same
---------------------- -------------------------- -----------
0.73                   0.73                       1
0                      0                          1
0.63921                0.63921                    1
-0.70945               -0.70945                   1
0.28                   0.28                       1
0.72000002861023       0.72000002861023           1
3.7                    3.7                        1
-0.01                  -0.01                      1
0.86                   0.86                       1
0.55489                0.55489                    1
0.439999997615814      0.439999997615814          1

警告

変換されたすべての文字列は小数点以下18桁で切り捨てられ、末尾のゼロはありません。18桁の精度は問題ではありません。また、FP番号の100%(100,000に近い値)は、データベースではFP番号と同じように、文字列値と同じに見えます。


0

特定の場合のアクセルの応答を少し変更すると、望ましくない結果が生成されます。

DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;

SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(@MyFloat AS DECIMAL(38,18)) AS VARCHAR(max)), '0', ' '))), ' ', '0'),'.',' ')),' ','.')

0
select replace(myFloat, '', '')

REPLACE()のドキュメント

入力引数の1つがnvarcharデータ型の場合、nvarcharを返します。それ以外の場合、REPLACEはvarcharを返します。
引数のいずれかがNULLの場合、NULLを返します。

テスト:
null ==> [NULL]
1.11 ==> 1.11
1.10 ==> 1.1
1.00 ==> 1
0.00 ==> 0
-1.10 ==> -1.1
0.00001 ==> 1e-005
0.000011 ==> 1.1e- 005


0

セレクト
キャスト((変換(小数(15,2)、acs_daily_debit)に取って代わる、 ' ''、')varchar型(20)のような)

acs_balance_detailsから


0

分子の答えに基づいて:

DECLARE @F FLOAT = 1000000000.1234;
SELECT @F AS Original, CAST(FORMAT(@F, N'#.##############################') AS VARCHAR) AS Formatted;

SET @F = 823399066925.049
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;

SET @F = 0.502184537571209
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;

0

私はちょうど同じような状況に遭遇し、SSMS v17.9.1 / SQL 2017内で提示された「非常に大きな数」の丸め問題に驚きました。

私が解決策を持っていることを示唆していませんが、FORMAT が正しいように見える数値を提示することに気付きました。これにより、丸めの問題がさらに減ったり、複雑な数学関数の中で役立つことを示唆することはできません。

T SQLコードは、供給すべき必要が生じた場合、そのコードやアイデアをテストするために他人を可能にしながら、明らかに私の所見を示しています。

WITH Units AS 
(
   SELECT 1.0 AS [RaisedPower] , 'Ten' As UnitDescription
   UNION ALL
   SELECT 2.0 AS [RaisedPower] , 'Hundred' As UnitDescription
   UNION ALL
   SELECT 3.0 AS [RaisedPower] , 'Thousand' As UnitDescription
   UNION ALL
   SELECT 6.0 AS [RaisedPower] , 'Million' As UnitDescription
   UNION ALL
   SELECT 9.0 AS [RaisedPower] , 'Billion' As UnitDescription
   UNION ALL
   SELECT 12.0 AS [RaisedPower] , 'Trillion' As UnitDescription
   UNION ALL
   SELECT 15.0 AS [RaisedPower] , 'Quadrillion' As UnitDescription
   UNION ALL
   SELECT 18.0 AS [RaisedPower] , 'Quintillion' As UnitDescription
   UNION ALL
   SELECT 21.0 AS [RaisedPower] , 'Sextillion' As UnitDescription
   UNION ALL
   SELECT 24.0 AS [RaisedPower] , 'Septillion' As UnitDescription
   UNION ALL
   SELECT 27.0 AS [RaisedPower] , 'Octillion' As UnitDescription
   UNION ALL
   SELECT 30.0 AS [RaisedPower] , 'Nonillion' As UnitDescription
   UNION ALL
   SELECT 33.0  AS [RaisedPower] , 'Decillion' As UnitDescription

)

SELECT UnitDescription

   ,              POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )                                                             AS ReturnsFloat
   ,        CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) )                                        AS RoundingIssues
   , STR(   CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) ) ,   CAST([RaisedPower] AS INT) + 2, 0) AS LessRoundingIssues
   , FORMAT(      POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  , '0')                                                     AS NicelyFormatted

FROM Units
ORDER BY [RaisedPower]

0
SELECT LTRIM(STR(float_field, 25, 0))

.0000値の最後に数字を追加しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.