web-dev-qa-db-ja.com

後続ゼロのないvarcharに浮動小数点数

末尾のゼロや科学表記がないFLOAT(53)フィールドをVARCHARに変換しようとしています。

フィールドには、非常に大きい数または非常に小さい数を含めることができます。それをVARCHARに変換し、小数点以下最大5桁を表示する必要がありますが、後続ゼロはありません。したがって、123.456789は123.45678であり、123456.78は123456.78である必要があります。

私はSQLを持っていますFiddle私が試したものを示す: http://sqlfiddle.com/#!6/bd392/4

3
IMTheNachoMan

SQL Server 2012以降のサポート FORMAT 。これにより、.NETのようなフォーマット文字列が有効になり、これはかなり簡単な作業になります。ただ使う

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

実用的なSQL Fiddle here

4
Glorfindel

わかりましたので、これが私の解決策です。これは、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;
0
Jonathan Fite

これはかなり見苦しいですが、必要なことを実行する必要があります(常に関数に変換できます)。

基本的には数値型に変換し(科学的記数要素を取り除き、小数点以下の数を制限します)、次に0との束を置き換えます。末尾のゼロやファンキーな数字になってしまわないようにしてください。

DECLARE @table1 TABLE
(
    [Num] FLOAT(53)
);

INSERT INTO @table1
VALUES
(10 ),
(.302563),
(423546532),
(34532.46524556);

SELECT Num,
       CAST(Num AS VARCHAR) AS One,
       STR(Num) AS Two,
       STR(Num, 10, 5) AS Three,
       REPLACE(
                  RTRIM(REPLACE(
                                   REPLACE(
                                              RTRIM(REPLACE(CONVERT(VARCHAR(20), CONVERT(NUMERIC(20, 5), Num)), 0, ' ')),
                                              ' ',
                                              '0'
                                          ),
                                   '.',
                                   ' '
                               )
                       ),
                  ' ',
                  '.'
              ) AS Four
FROM @table1;
0
Nic