web-dev-qa-db-ja.com

SQL Serverの10進数から末尾のゼロを削除します

DECIMAL(9,6)があります。つまり、999,123456のような値をサポートします。

しかし、123,4567のようなデータを挿入すると、123,456700になります

それらのゼロを削除する方法は?

74
abatishchev

decimal(9,6)は、コンマの右側に6桁を格納します。末尾のゼロを表示するかどうかは、通常はクライアント側で実装されるフォーマットの決定です。

ただし、SSMSはfloatを後続ゼロなしでフォーマットするため、decimalfloatにキャストすることにより、後続ゼロを削除できます。

select 
    cast(123.4567 as DECIMAL(9,6))
,   cast(cast(123.4567 as DECIMAL(9,6)) as float)

プリント:

123.456700  123,4567

(私の小数点記号はコンマですが、SSMSは小数点で小数点をフォーマットします。どうやら 既知の問題 。)

130
Andomar

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でも機能します。

28
robert4
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
14
Bat_Programmer

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#####などのフォーマット文字列を使用します

小数点はローカライズされているため、コンマを小数点区切り文字として使用するカルチャでは、。は

もちろん、これはデータレイヤーでフォーマットを行うことを推奨する方法です(ただし、私の場合、他のレイヤーはありません。ユーザーは文字通りストアドプロシージャを実行し、結果を電子メールに入れます:/)

9
Caius Jard
SELECT REVERSE(ROUND(REVERSE(2.5500),1))

プリント:

2.55
6
user1959416
Cast(20.5500 as Decimal(6,2))

それを行う必要があります。

3
Peter Jones

最良の方法は、精度が失われる可能性があるため、変換前に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)

2
Mahmoud Moravej

同様の問題があり、xx0000,x00000,xxx000のような数字から末尾のゼロを削除する必要がありました

私が使用した:

select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename

コードは、トリミングする番号を含むフィールドの名前です。これが他の誰かに役立つことを願っています。

2
Kazeem Muritala

私は同様の問題を抱えていましたが、小数点が存在しない小数点を削除する必要もありました。ここでは、小数点をコンポーネントに分割し、小数点の文字列から取得する文字数を分数コンポーネント(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') 

結果は痛みを伴いますが、私は知っていますが、上記の答えから多くの助けを借りてそこに着きました。

2
Adge Cutler

別のオプション...

これがどれほど効率的かは分かりませんが、フロート経由では機能せず、動作しません:

select replace(rtrim(replace(
       replace(rtrim(replace(cast(@value as varchar(40)), '0', ' ')), ' ', '0')
       , '.', ' ')), ' ', '.')

中央の行は末尾のスペースを取り除き、外側の2行は小数点がない場合はポイントを削除します

1
SQLian

tSQLの先頭と末尾のゼロを削除することができます

  1. 文字列でない場合は、STR TSQL関数を使用して文字列に変換してから、

  2. 先行ゼロと後続ゼロの両方を削除します

    SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
    
  3. フォーラム の詳細。

1
Ishtiaq

特定の長さの文字列のみを出力できるように、小数点以下のゼロを削除する必要がありました 一流 ゼロ

(たとえば、142.023400が000000142.0234になるように14文字を出力する必要がありました)、

parsenamereverseおよびcastas intを使用して、末尾のゼロを削除しました。

SELECT
    PARSENAME(2.5500,2)
    + '.'
    + REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))

(先頭のゼロを取得するには、上記の長さに基づいて正しい数のゼロを複製し、これを上記の前に連結します)

これが誰かの助けになることを願っています。

1
Ali

これを試して :

SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")

20.55を与える

1
Todd
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
0
beloblotskiy

これはどう?関数に入力されるデータを@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
0
MrNazgul

私はこれが古い投稿であることを理解していますが、私が思いついた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
0
Abhi

これを試して。

select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
0
Vishal Kiri

最も簡単な方法は、値をFLOATとしてキャストしてから、文字列データ型にキャストすることです。

CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
0
Brad Raiche