あなたはただすることができます
CAST(CAST(value AS float) AS decimal(36, 20))
しかし...
これを行うと、float へのキャストは、内部に E を持たないすべての値も変更します - float は machine-epsilon と同じくらい正確にしかできないためです ...
数値に E (+/-) が含まれている場合にのみ float にキャストすることで、これを軽減できます。
通常の 10 進数の場合は、10 進数に直接キャストするだけです。
これにより、浮動小数点の丸め誤差が最小限に抑えられます。
SELECT
CASE
WHEN factor LIKE '%E-%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20))
WHEN factor LIKE '%E+%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20))
ELSE CAST(factor AS DECIMAL(36, 20))
END AS factor
FROM T_IFC_Import_Currency
またはよりコンパクト:
SELECT
CASE
WHEN factor LIKE '%E[+-]%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20))
ELSE CAST(factor AS DECIMAL(36, 20))
END AS factor
FROM T_IFC_Import_Currency
注:
これを次のように単純化しないでください。
SELECT
CAST
(
CASE
WHEN factor LIKE '%E[+-]%' THEN CAST(factor AS FLOAT)
ELSE factor
END
AS decimal(36,20)
) AS factor
FROM T_IFC_Import_Currency
これは、case 式が 10 進数にキャストされる前に最初に暗黙的に float にキャストされることを意味するためです...