如何替代和展示" 0"查询失败时为NULL

时间:2012-10-15 01:29:35

标签: sql razor webmatrix

我正在使用剃须刀在MS WebMatrix工作。

我遇到的问题是,如果我的一个查询解析为错误(例如除以0),则整个页面都会失败。我希望查询输出“0”。

代码:

var itot = db.QueryValue("SELECT SUM(SUBTOTAL) from dbo.DR_TRANS where TRANSDATE = 41195 and SUBTOTAL >0");

var ctot = db.QueryValue("SELECT SUM(SUBTOTAL) from dbo.DR_TRANS where TRANSDATE = 41195 and TRANSTYPE = 1 and SUBTOTAL <0");

var nett = itot + ctot;

因此,如果itot或ctot呈现Null或错误,因为所选日期没有条目,我如何让它将错误视为“0”,以便数学仍然有效?在这个例子中,itot是今天提出的总发票,ctot是今天筹集的总信用额。

如果还没有发票,或者还没有筹集任何信用,我的代码会抛出错误并关闭页面。我希望它显示0,如果没有任何一个,和itot的值如果没有ctot。

我做错了什么?它在每个都有的时候工作正常,但我希望它在此之前工作,因为页面上还有其他代码用于显示其他查询结果。

我对编码查询非常陌生,因此在线搜索时我会错过一个基本答案!

2 个答案:

答案 0 :(得分:2)

使用COALESCE包装聚合函数应该返回0而不是NULL

SELECT COALESCE(SUM(SUBTOTAL), 0)
   FROM dbo.DR_TRANS
   WHERE TRANSDATE = 41195
     AND SUBTOTAL >0

即如果第一个参数不为null则返回第一个参数的函数,如果第一个参数为NULL则返回第二个参数。我不知道webmatrix使用什么功能,但COALESCE非常标准。在Oracle中,您可以使用NVLISNULL是另一个这样的功能。

答案 1 :(得分:1)

@Glenn使用SQL提供了一个非常好的解决方案。但是,您可能更愿意了解如何处理c#中的空值。 null-coalescing operator ??是满口的,如果某些东西不为空,则表示使用它,如果它为空,则使用后面的内容。一个例子比我刚才写的更容易理解。代码的最后一行如下所示:

var nett = itot ?? 0 + ctot ?? 0;

基本上?? ?? 0表示如果它为null,则将其视为零,否则使用该值本身。

我更喜欢在c#中尽可能多地做,并保持我的SQL尽可能简单。但我认识到这更多是个人偏好。

通常,在某些情况下,您必须处理SQL返回的空值,可能是null表示用户未输入任何内容的字段,零表示用户输入的值为零。在这种情况下,您可以在c#中测试null,例如

if ( itot == null )
{
    // do appropriate null stuff
    itot = 0;
} 
else
{
    // do non null stuff
    // nothing needed in this case
}