Sql-Server
將值格式化為配置的小數位數
我想根據另一個表中指定的配置值格式化一個數字以顯示小數位。如果配置的值為 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));