Sql-Server

將值格式化為配置的小數位數

  • April 21, 2020

我想根據另一個表中指定的配置值格式化一個數字以顯示小數位。如果配置的值為 NULL,則小數位數應預設為 2(此處為硬編碼) 以下語句工作正常,但對於像 3.50000 這樣的值,即使“NumberOfDecimalPlaces”的配置值為 2 或 3,它也會返回 3.5。我得到這是 ROUND() 的期望行為

ROUND([ActualValue], COALESCE([ConfigurationTable].[NumberOfDecimalPlaces], 2)) [FormattedActualValue]

作為替代方案,我嘗試了 CONVERT AND CAST。

SELECT CAST ([ActualValue] AS NUMERIC(16, COALESCE([ConfigurationTable].[NumberOfDecimalPlaces], 2))

SELECT CONVERT(DECIMAL (16, COALESCE([ConfigurationTable].[NumberOfDecimalPlaces], 2)), [ActualValue])

Incorrect syntax near the keyword 'COALESCE'.我知道這兩個錯誤都是數據類型定義的第二個參數不可為空,因此是錯誤的。我有哪些選擇?如何以最小的性能成本實現這一目標?

STR功能似乎是您正在尋找的:

DECLARE @NumberOfDecimalPlaces tinyint = 3;
DECLARE @ActualValue decimal(16,5) =  3.50

SELECT FormattedActualValue = 
   STR(
       @ActualValue, 
       CAST(@ActualValue / 10 AS int) + @NumberOfDecimalPlaces + 2,
       COALESCE(@NumberOfDecimalPlaces,2)
   )

您不能使用參數/變數來獲得精度,因此您需要為此使用動態 SQL。這裡的性能成本相對接近於零。

DECLARE @NumberOfDecimalPlaces tinyint;

SET @NumberOfDecimalPlaces = 3;

DECLARE @sql nvarchar(max) = N'SELECT FormattedActualValue = 
 CONVERT(DECIMAL(16, $decimal_places$), 13.5457);';

SET @sql = REPLACE(@sql, N'$decimal_places$', COALESCE(@NumberOfDecimalPlaces,2));

EXEC sys.sp_executesql @sql;

看到 Gianluca 的回答後,我開始玩其他東西,這可能會也可能不會滿足您的需求(取決於您是否想要在以下情況下使用尾隨@DecimalPlaces > (decimal places in original value)

DECLARE @DecimalPlaces tinyint       = 5,
       @ActualValue   decimal(16,5) = 3.561735;

SELECT LTRIM(STR(ROUND(@ActualValue,@DecimalPlaces),20,@DecimalPlaces));

引用自:https://dba.stackexchange.com/questions/164413