末尾のゼロや科学表記がないFLOAT(53)
フィールドをVARCHAR
に変換しようとしています。
フィールドには、非常に大きい数または非常に小さい数を含めることができます。それをVARCHARに変換し、小数点以下最大5桁を表示する必要がありますが、後続ゼロはありません。したがって、123.456789は123.45678であり、123456.78は123456.78である必要があります。
私はSQLを持っていますFiddle私が試したものを示す: http://sqlfiddle.com/#!6/bd392/4
わかりましたので、これが私の解決策です。これは、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との束を置き換えます。末尾のゼロやファンキーな数字になってしまわないようにしてください。
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;