Sql-Server

浮動到無尾隨零的 varchar

  • December 18, 2017

我有一段時間試圖將一個FLOAT(53)欄位轉換VARCHAR為沒有尾隨零或科學記數法的欄位。

該欄位可能有一個非常大或非常小的數字。我需要將其轉換為 VARCHAR 並在小數點後最多顯示 5 位數字,但不顯示尾隨零。所以 123.456789 應該是 123.45678 而 123456.78 應該是 123456.78。

我有一個 SQL Fiddle 顯示我嘗試過的內容:http ://sqlfiddle.com/#!6/bd392/4

SQL Server 2012 及更高版本的支持FORMAT,它啟用了類似 .NET 的格式字元串,這使這項任務變得相當容易;只需使用

FORMAT(Num, '0.#####')

在這里工作 SQL Fiddle 。

好的,這是我的解決方案。它利用了 STR 的可選參數,絕對不漂亮,但它確實有效。確實,字元串操作(就是這樣)應該在更高的層次上完成。

DECLARE @Test TABLE (FloatValue FLOAT(53) NOT NULL);

INSERT INTO @Test (FloatValue)
VALUES (10)
      , (.302563)
      , (423546532)
      , (34532.46524556)
      , (654.048);

WITH CTE_Base
AS
   (   SELECT FloatValue
              , StrValue = REPLACE(LTRIM(RTRIM(STR(FloatValue, 50, 5))), '.00000', '')
              , DecPosition = CHARINDEX('.', REPLACE(LTRIM(RTRIM(STR(FloatValue, 50, 5))), '.00000', ''))
              , Reversed = REVERSE(REPLACE(LTRIM(RTRIM(STR(FloatValue, 50, 5))), '.00000', ''))
              , LastNonZeroPos = PATINDEX(
                                     '%[^0]%', REVERSE(REPLACE(LTRIM(RTRIM(STR(FloatValue, 50, 5))), '.00000', '')))
       FROM @Test)
SELECT *
      , FinalValue = SUBSTRING(StrValue
                                      , 1
                                      , CASE WHEN DecPosition = 0
                                                  THEN LEN(StrValue)
                                            ELSE          LEN(StrValue) - LastNonZeroPos + 1
                                             END)
FROM CTE_Base;

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