1

我正在使用剃刀在 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,如果没有 ctot,我希望它显示 itot 的值。

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

我对编码查询很陌生,所以在我的在线搜索中会有一个我错过的基本答案!

4

2 回答 2

2

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

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

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

于 2012-10-15T02:00:13.077 回答
1

@Glenn 使用 SQL 提供了一个完美的解决方案。但是,您可能更愿意了解如何在 c# 中处理空值。空合并运算符 ?? 这是一口,说如果某事不为空,则使用它,如果为空,则使用 ?? 之后的内容。一个例子比我刚刚写的更容易理解。您的代码的最后一行如下所示:

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

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

我更喜欢在 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
}
于 2012-10-15T02:45:22.620 回答