Удалить завершающие нули из десятичного числа в SQL Server - PullRequest
72 голосов
/ 30 мая 2010

У меня есть столбец DECIMAL(9,6), т.е. он поддерживает такие значения, как 999,123456.

Но когда я вставляю данные вроде 123,4567, они становятся 123,456700

Как убрать эти нули?

Ответы [ 22 ]

1 голос
/ 07 февраля 2013

Другой вариант ...

Я не знаю, насколько это эффективно, но, похоже, это работает и не работает через float:

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

Средняя линия убирает завершающие пробелы, внешние две убирают точку, если нет десятичных цифр

0 голосов
/ 02 июня 2017

Столбец DECIMAL (9,6) будет преобразован в плавающее без потери точности, поэтому CAST (... AS float) сделает свое дело.


@ HLGEM: говорить, что поплавок - плохой выбор для хранения чисел, а «Никогда не использовать поплавок» - неверно - вы просто должны знать свои числа, например Измерения температуры будут проходить плавно.

@ abatishchev и @japongskie: префиксы перед хранимыми в SQL процессорами и функциями все еще хорошая идея, если не требуется; ссылки, которые вы упомянули, только запрещают использовать префикс "sp_" для хранимых процедур, которые вы не должны использовать, другие префиксы хороши, например, "usp_" или "spBob _"

Ссылка: «Все целые числа с 6 или менее значащими десятичными цифрами могут быть преобразованы в значение с плавающей точкой IEEE 754 без потери точности»: https://en.wikipedia.org/wiki/Single-precision_floating-point_format

0 голосов
/ 30 июня 2016

Самый простой способ - это CAST-значение как FLOAT, а затем строковый тип данных.

CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
0 голосов
/ 06 ноября 2015

Попробуйте это:

select isnull(cast(floor(replace(rtrim(ltrim('999,999.0000')),',','')) as int),0)
0 голосов
/ 09 сентября 2015

попробуйте это.

select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
0 голосов
/ 07 августа 2013

можно удалить начальные и конечные нули в TSQL

  1. Преобразовать его в строку, используя функцию STR TSQL, если не строка, то

  2. Удаление начальных и конечных нулей

    SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
    
  3. Больше информации на форуме .

0 голосов
/ 16 декабря 2014

Я знаю, что этот поток очень старый, но для тех, кто не использует SQL Server 2012 или выше или не может использовать функцию FORMAT по любой причине, тогда работает следующее.

Кроме того, многие решения не работали, если число было меньше 1 (например, 0,01230000).

Обратите внимание, что следующее не работает с отрицательными числами.

DECLARE @num decimal(28,14) = 10.012345000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0') 

set @num = 0.0123450000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0') 

Возвращает 10.012345 и 0.012345 соответственно.

0 голосов
/ 31 мая 2013

Как насчет этого? Предполагая, что данные поступают в вашу функцию как @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 голосов
/ 24 июля 2014

Я понимаю, что это старый пост, но хотел бы предоставить 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 голосов
/ 20 февраля 2012

Попробуйте это:

select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100
...