列DECIMAL(9,6)
があります。つまり、999,123456のような値をサポートします。
しかし、123,4567のようなデータを挿入すると、123,456700になります
それらのゼロを削除する方法は?
decimal(9,6)
は、コンマの右側に6桁を格納します。末尾のゼロを表示するかどうかは、通常はクライアント側で実装されるフォーマットの決定です。
ただし、SSMSはfloat
を後続ゼロなしでフォーマットするため、decimal
をfloat
にキャストすることにより、後続ゼロを削除できます。
select
cast(123.4567 as DECIMAL(9,6))
, cast(cast(123.4567 as DECIMAL(9,6)) as float)
プリント:
123.456700 123,4567
(私の小数点記号はコンマですが、SSMSは小数点で小数点をフォーマットします。どうやら 既知の問題 。)
FORMAT()
関数(SqlAzureおよびSql Server 2012+)を使用できます。
SELECT FORMAT(CAST(15.12 AS DECIMAL(9,6)), 'g18') -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10') -- '0.000158'
SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- '2'
FLOAT(またはREAL)を使用する場合は注意してください:g17
以上(またはREALでg8
以上)は使用しないでください。
SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17') -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8') -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7') -- '0.9'
さらに、 ドキュメント に従って:
FORMATは、.NET Framework共通言語ランタイム(CLR)の存在に依存しています。この関数は、CLRの存在に依存するため、リモート化されません。 CLRを必要とする関数をリモート処理すると、リモートサーバーでエラーが発生します。
SqlAzureでも機能します。
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
Floatが表すことができるよりも多くの桁が10進数になる可能性があるため、floatにキャストすることに消極的でした
FORMAT
は、標準の.net形式文字列 'g8'と共に使用すると、非常に小さい小数(例:1e-08)の場合でも科学表記法を返しますが、これも不適切です
カスタム形式の文字列( https://docs.Microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings )を使用すると、私が望むものを実現できました:
DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
番号に少なくとも1つの末尾のゼロが必要な場合、2.0が2にならないようにするには、0.0#####
などのフォーマット文字列を使用します
小数点はローカライズされているため、コンマを小数点区切り文字として使用するカルチャでは、。は
もちろん、これはデータレイヤーでフォーマットを行うことを推奨する方法です(ただし、私の場合、他のレイヤーはありません。ユーザーは文字通りストアドプロシージャを実行し、結果を電子メールに入れます:/)
SELECT REVERSE(ROUND(REVERSE(2.5500),1))
プリント:
2.55
Cast(20.5500 as Decimal(6,2))
それを行う必要があります。
最良の方法は、精度が失われる可能性があるため、変換前にFLOATまたはMONEYに変換しないことです。したがって、安全な方法は次のようになります。
CREATE FUNCTION [dbo].[fn_ConvertToString]
(
@value sql_variant
)
RETURNS varchar(max)
AS
BEGIN
declare @x varchar(max)
set @x= reverse(replace(ltrim(reverse(replace(convert(varchar(max) , @value),'0',' '))),' ',0))
--remove "unneeded "dot" if any
set @x = Replace(RTRIM(Replace(@x,'.',' ')),' ' ,'.')
return @x
END
@valueはany decimal(x、y)
同様の問題があり、xx0000,x00000,xxx000
のような数字から末尾のゼロを削除する必要がありました
私が使用した:
select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename
コードは、トリミングする番号を含むフィールドの名前です。これが他の誰かに役立つことを願っています。
私は同様の問題を抱えていましたが、小数点が存在しない小数点を削除する必要もありました。ここでは、小数点をコンポーネントに分割し、小数点の文字列から取得する文字数を分数コンポーネント(CASEを使用しない)。問題をさらに面白くするために、私の数値は小数点なしの浮動小数点数として保存されました。
DECLARE @MyNum FLOAT
SET @MyNum = 700000
SELECT CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),2) AS VARCHAR(10))
+ SUBSTRING('.',1,LEN(REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')))
+ REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')
結果は痛みを伴いますが、私は知っていますが、上記の答えから多くの助けを借りてそこに着きました。
別のオプション...
これがどれほど効率的かは分かりませんが、フロート経由では機能せず、動作しません:
select replace(rtrim(replace(
replace(rtrim(replace(cast(@value as varchar(40)), '0', ' ')), ' ', '0')
, '.', ' ')), ' ', '.')
中央の行は末尾のスペースを取り除き、外側の2行は小数点がない場合はポイントを削除します
tSQLの先頭と末尾のゼロを削除することができます
文字列でない場合は、STR TSQL関数を使用して文字列に変換してから、
先行ゼロと後続ゼロの両方を削除します
SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
フォーラム の詳細。
特定の長さの文字列のみを出力できるように、小数点以下のゼロを削除する必要がありました 一流 ゼロ
(たとえば、142.023400が000000142.0234になるように14文字を出力する必要がありました)、
parsename
、reverse
およびcast
as int
を使用して、末尾のゼロを削除しました。
SELECT
PARSENAME(2.5500,2)
+ '.'
+ REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))
(先頭のゼロを取得するには、上記の長さに基づいて正しい数のゼロを複製し、これを上記の前に連結します)
これが誰かの助けになることを願っています。
これを試して :
SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
20.55を与える
case when left(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end +
replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0') +
case when right(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end
これはどう?関数に入力されるデータを@thisDataとして想定:
BEGIN
DECLARE @thisText VARCHAR(255)
SET @thisText = REPLACE(RTRIM(REPLACE(@thisData, '0', ' ')), ' ', '0')
IF SUBSTRING(@thisText, LEN(@thisText), 1) = '.'
RETURN STUFF(@thisText, LEN(@thisText), 1, '')
RETURN @thisText
END
私はこれが古い投稿であることを理解していますが、私が思いついたSQLを提供したいと思います
DECLARE @value DECIMAL(23,3)
set @value = 1.2000
select @value original_val,
SUBSTRING( CAST( @value as VARCHAR(100)),
0,
PATINDEX('%.%',CAST(@value as VARCHAR(100)))
)
+ CASE WHEN ROUND(
REVERSE( SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
)
,1) > 0 THEN
'.'
+ REVERSE(ROUND(REVERSE(SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
),1))
ELSE '' END AS modified_val
これを試して。
select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
最も簡単な方法は、値をFLOATとしてキャストしてから、文字列データ型にキャストすることです。
CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))