SQLServer之CAST

本文探讨了在SQL Server中处理NULL值的有效方法。通过具体案例分析了原生CAST操作及ISNULL函数在处理NULL值时的局限性,并提供了一种使用CASE语句结合CAST来正确转换NULL值为字符串的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日在处理一个客户反馈的问题时,走查代码,发现对异常的保护很不够。

比如假设有这么一张表,表名为Data,字段都为int类型,允许为NULL。

noA1A2A3A4A5
1-80-81-82NULLNULL
2-90-91NULL-92NULL

现在需要把A1-A5,转换成一个字符串,数值间用分号连接。对于NULL的数据,用空字符串代替。对于上面的表数据,结果是如下两个字符串:

-80;-81;-82;;;

-90;-91;;-92;;

原来的写法是:

 SELECT CAST(Data.A1 AS nvarchar(20)) + ';' + CAST(Data.A2 AS nvarchar(20))
 + CAST(Data.A3 AS nvarchar(20))+ ';' + CAST(Data.A4 AS nvarchar(20))
 + ';' + CAST(Data.A5 AS nvarchar(20)) AS [Ax] 
 FROM Data

上面的语句,得到的结果是NULL。

根据SQLServer的CAST定义:

-- Syntax for CAST:  
CAST ( expression AS data_type [ ( length ) ] )
对于expression为NULL时,显然NULL并不能转变成任何的data_type,返回结果为NULL。

而对于X+NULL这类表达式来说,其结果仍然为NULL。究其原因,是因为SQL Server是三值逻辑(TRUE,FALSE,UNKNOWN)。UNKNOWN就是用以处理NULL的。

因此,上面的SQL语句,输出NULL是可以预期的结果。


那么如何修改呢?有人提出用ISNULL函数可否?ISNULL定义如下:

ISNULL ( check_expression , replacement_value )
其中, check_expression为 将被检查是否为 NULL 的 表达式 check_expression  可以为任何类型。

replacement_value为当  check_expression 为 NULL 时要返回的表达式。 而根据msdn,特别需要注意的是:replacement_value 必须是可以隐式转换为  check_expresssion 类型的类型。 也就是说,ISNULL(Data.A3, ''),返回的将是0,而不是空字符串。因为A3的类型是int。 因此ISNULL也是行不通的。
上述需求的最终解决办法,是对每个字段进行is null判断,即类似:
is null ? '': CAST (expression AS data_type)
翻译成SQL语句为下:
 
 SELECT CASE when Data.A1 is null then '' else CAST(Data.A1 AS nvarchar(20)) END + ';' +
        CASE when Data.A2 is null then '' else CAST(Data.A2 AS nvarchar(20)) END + ';' +
	CASE when Data.A3 is null then '' else CAST(Data.A3 AS nvarchar(20)) END + ';' +
	CASE when Data.A4 is null then '' else CAST(Data.A4 AS nvarchar(20)) END + ';' +
	CASE when Data.A5 is null then '' else CAST(Data.A5 AS nvarchar(20)) END  AS [Ax]
 from Data

对于有趣的NULL,可以参考如下链接:http://www.cnblogs.com/changbluesky/archive/2010/05/07/1729519.html

### SQL ServerCAST 函数与浮点数 (FLOAT) 类型转换 在 SQL Server 中,`CAST` 函数可以用来将一种数据类型显式地转换为另一种数据类型。对于浮点数 (`FLOAT`) 类型的转换,通常涉及到 `DECIMAL` 或者字符串类型的相互转换。 #### 示例:从 DECIMAL 到 FLOAT 的转换 当需要将精确的小数值(如 `DECIMAL`)转换为近似的小数值(如 `FLOAT`),可以使用 `CAST` 函数: ```sql DECLARE @dec_value AS DECIMAL(18, 4); SET @dec_value = 1234567.8901; SELECT CAST(@dec_value AS FLOAT) AS FloatValue; ``` 这段代码会将一个高精度的十进制数转换成较低精度的浮点数[^1]。 #### 示例:从 STRING 到 FLOAT 的转换 有时也需要将表示数字的字符串转为浮点数,这同样可以通过 `CAST` 实现: ```sql DECLARE @str_value AS VARCHAR(20); SET @str_value = '123456'; SELECT CAST(@str_value AS FLOAT) AS FloatValue; ``` 需要注意的是,如果尝试转换无法解析为有效浮点数的字符串,则会产生错误[^5]。 #### 浮点数之间的不同精度转换 SQL Server 支持两种不同的浮点数精度——单精度 (`FLOAT(24)`) 和双精度 (`FLOAT(53)`)[^4]。可以根据需求选择合适的精度级别来进行转换操作: ```sql DECLARE @f_low FLOAT(24), @f_high FLOAT(53); SELECT @f_low = CAST(CAST(1.0 AS DECIMAL(2, 1)) / 3 AS FLOAT(24)), @f_high = CAST(CAST(1.0 AS DECIMAL(2, 1)) / 3 AS FLOAT(53)); SELECT 1.0 / 3 AS Original, @f_low AS LowPrecisionFloat, @f_high AS HighPrecisionFloat; ``` 此例子展示了如何分别设置低精度和高精度的浮点数,并比较它们的结果差异。 #### 处理可能发生的转换失败 为了防止因非法输入而导致程序崩溃,在进行任何潜在危险的操作之前应该考虑加入异常处理机制。例如,利用 TRY...CATCH 结构来捕捉可能出现的问题并给出适当反馈[^3]。 ```sql BEGIN TRY DECLARE @invalid_str AS VARCHAR(MAX) = ''; SELECT CAST(@invalid_str AS FLOAT) AS Result; END TRY BEGIN CATCH PRINT ERROR_MESSAGE(); END CATCH; ``` 以上就是有关于 SQL Server 使用 `CAST` 进行浮点数(`FLOAT`)类型转换的一些基本概念及其实践案例介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值