Округление значения в столбце varchar в MS SQL Server 2012? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть странное требование округлять значение в столбце varchar в SQL Server 2012. Я знаю, что неправильно хранить числовые значения в varchar.

, т. Е. Столбец являетсяvarchar но содержит строку, представляющую число.У меня есть строковые значения, такие как 834.78330000000005 и 831.06669999999997 и 797.45000000000005, но я хочу обновить их до строковых значений, таких как 834.7833 и 831.0667 и 797.45 (обрезка конечных нулей не слишком важна, но желательна).

Это, кажется, близко,есть лучшие варианты?Должен ли я использовать функцию раунда?

CREATE TABLE [Clinical].[AAAJFJunk]
(
    [Call Length] [NVARCHAR](50) NULL
) ON [PRIMARY]

INSERT [Clinical].[AAAJFJunk] ([Call Length] ) 
VALUES (N'834.78330000000005'), 
       (N'831.06669999999997'),
       (N'797.45000000000005')
GO

UPDATE Clinical.AAAJFJunk
SET [Call Length] =
       CAST(CAST([Call Length] AS DECIMAL(11, 4)) AS VARCHAR);

1 Ответ

0 голосов
/ 28 февраля 2019

Пример выбора для проверки предложенных значений:

select 
      case when ISNULL([Call Length], '') = '' 
      then '' 
      else 
 FORMAT(Cast ( CONVERT(numeric(16,4), CAST([Call Length] AS FLOAT)) as float),'########0.####')   
      end as    val123
    from Clinical.AAAJFJunk

Оператор обновления.

Включает обработку нулевого значения (т.е. оставляет их нетронутыми)

Включает обработку научных значенийзначения с обозначением E в исходных строковых значениях.например, 6.6699999999999995E-2

Включает удаление конечного нуля с правой стороны числа

Используется функция Format.

Функция STR с плавающей запятой оставляет конечные нули, поэтомуЯ этим не пользовался.

Функция Convert с плавающей точкой в ​​строке определяет собственное количество десятичных знаков, поэтому я также хотел этого избежать!

UPDATE Clinical.AAAJFJunk
SET [Call Length] =
      case when ISNULL([Call Length], '') = '' 
      then '' else 
            FORMAT(Cast ( CONVERT(numeric(16,4), CAST([Call Length] AS FLOAT)) as float),'########0.####')   end

Обратите внимание на 0в спецификаторе формата имеет конкретное значение.

Пожалуйста, см .:

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings

...