关于sql:cast或将float转换为nvarchar?

cast or convert a float to nvarchar?

我需要从数据类型float的一列中进行选择,并将其作为nvarchar插入另一列中。

我尝试投射它:cast([Column_Name] as nvarchar(50))

结果为9.07235e+009,而不是10位数字(电话号码)。

有人知道如何正确地转换或转换此数据吗?


检查STR。您需要类似SELECT STR([Column_Name],10,0)的东西**这是SQL Server解决方案,对于其他服务器,请检查其文档。


如果您将电话号码存储在浮点型列中(这是一个坏主意),那么它们大概都是整数,可以在转换为nvarchar之前将其转换为int。

因此而不是:

1
2
SELECT CAST(CAST(1234567890 AS FLOAT) AS nvarchar(50))
1.23457e+009

您将使用:

1
2
SELECT CAST(CAST(CAST(1234567890 AS FLOAT) AS INT) AS nvarchar(50))
1234567890

在这些示例中,最里面的cast(1234567890 as float)用于代替从相应列中选择值。

我真的建议您不要将电话号码存储在花车中!
如果电话号码以零开头怎么办?

1
2
SELECT CAST(0100884555 AS FLOAT)
100884555

哇!我们只是存储了错误的电话号码...


请勿使用浮点数存储精度要求的定点数据。
此示例说明如何将浮点数正确转换为NVARCHAR(50),同时还说明了为什么对精确度数据使用浮点数是个坏主意。

1
2
3
4
5
6
7
8
9
10
CREATE TABLE #f ([Column_Name] FLOAT)
INSERT #f SELECT 9072351234
INSERT #f SELECT 907235123400000000000

SELECT
    CAST([Column_Name] AS nvarchar(50)),
    --cast([Column_Name] as int), Arithmetic overflow
    --cast([Column_Name] as bigint), Arithmetic overflow
    CAST(LTRIM(STR([Column_Name],50)) AS NVARCHAR(50))
FROM #f

输出

1
2
9.07235e+009    9072351234
9.07235e+020    907235123400000010000

您可能会注意到第二个输出以\\'10000 \\'结尾,即使我们尝试存储在表中的数据以\\'00000 \\'结尾。这是因为float数据类型支持固定数量的有效数字,但并没有延伸那么远。


对于愿意尝试其他方法的任何人,他们可以使用以下方法:

1
SELECT FORMAT([Column_Name], '') FROM YourTable

这将轻松将任何float值更改为nvarchar。


您还可以执行以下操作:

1
SELECT CAST(CAST(34512367.392 AS DECIMAL(30,9)) AS NVARCHAR(100))

输出:
34512367.392000000


浮点数不会直接转换为NVARCHAR,首先我们需要将浮点数转换为money数据类型,然后再转换为NVARCHAR,请参见下面的示例。

例1

1
SELECT CAST(CAST(1234567890.1234  AS FLOAT) AS NVARCHAR(100))

输出

1
1.23457e+009

例2

1
SELECT CAST(CAST(CAST(1234567890.1234  AS FLOAT) AS MONEY) AS NVARCHAR(100))

输出

1
1234567890.12

在Example2中,值转换为float到NVARCHAR


1
2
3
4
5
DECLARE @MyFloat [FLOAT]

SET @MyFloat = 1000109360.050

SELECT REPLACE (RTRIM (REPLACE (REPLACE (RTRIM ((REPLACE (CAST (CAST (@MyFloat AS DECIMAL (38 ,18 )) AS VARCHAR( MAX)), '0' , ' '))), ' ' , '0'), '.', ' ')), ' ','.')