SQL Server的 isnull 函数

本文探讨了在使用SQL的sum()等聚合函数时,遇到的空值问题及解决方案。作者在处理未结账总充值金额查询时,发现即使没有数据,sum()函数也会返回空字符串而非预期的空表。文章提供了如何正确处理这种情况的方法,包括使用isnull()、nvl()或ifnull()函数来避免转换类型时的错误。

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

今天我在敲机房结账的时候遇到一个问题,就是查询汇总金额的时候,比如:查询未结账的总充值金额。我用的是SQL的sum()函数,SQL语句是这么写的:

string sql = "select sum(RechCash) from Recharge where IsCheck = 0 and OperatorID = @operatorID"

如果没有符合条件的数据,我本以为会返回一个空表,所以我在B层会判断返回的表中有没有数据,如果有数据就转换成decimal型返回,如果没有数据就返回0。代码如下:

if (dt.Rows.Count > 0)
{
    return (decimal)dt.Rows[0][0];
}
else
{
    return 0;
}

可是让我没有想到的是,即使没有数据,返回的表中也会有一条数据。如下图:
在这里插入图片描述
从错误中可以看出表中确实有一条数据,我把SQL语句复制到SQL Server2014中查看查询的结果。
在这里插入图片描述
可见查出来的结果为NULL,但是返回的表中确实有一条数据,而且不是0,否则不会报错。所以我就想看看表中究竟存的什么。
在这里插入图片描述
我发现竟然表中竟然存的是一个空字符串,所以强制抓换为decimal类型时才会报错。
知道了表中存的是什么数据我就知道怎样处理了:

if (dt.Rows[0][0].ToString() == string.Empty)
{
    return 0;
}
else
{
    return (decimal)dt.Rows[0][0]; ;
}

所以,最后我发现如果D层的SQL语句如果用聚合函数,即使没有数据,也会返回一个空字符串;而如果不用聚合函数的,只查询字段的话,没有符合数据的条件就会返回一个空表。

isnull函数

但是如果查询数据库为NULL,其实处理不用这么麻烦,只要在SQL语句中用一个isnull() 函数就行了。如下图:
在这里插入图片描述
如果数据库是oracel就用nvl(),如果数据库是Mysql就用ifnull()。
这个函数是一个空值转换函数,有点儿类似于三元表达式。如果第一个参数为NULL,则返回第二个参数,如果不为NUll,就正常返回。但是它有一个限制条件,就是两个参数的类型必须相同。

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值