1

私はかみそりを使用してMSWebMatrixで作業しています。

私が抱えている問題は、クエリの1つがエラー(たとえば、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戻る必要があります。0NULL

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

つまり、nullでない場合は最初のパラメーターを返し、最初のパラメーターがNULLの場合は2番目のパラメーターを返す関数です。で使用する関数はわかりませんがwebmatrixCOALESCEかなり標準的です。Oracleでは、を使用できますNVLISNULL別のそのような関数です。

于 2012-10-15T02:00:13.077 に答える
1

@Glennは、SQLを使用した完全に優れたソリューションを提供します。ただし、c#でnullを処理する方法を理解することをお勧めします。null合体演算子?? これは一口で、何かがnullでない場合はそれを使用し、nullの場合は??の後にあるものを使用します。例は、私が今書いたものよりもはるかに理解しやすいです。コードの最後の行は次のようになります。

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

基本的に?? 0は、nullの場合はゼロとして扱い、それ以外の場合は値自体を使用することを示します。

私はc#で可能な限り多くのことを行い、SQLを可能な限りシンプルに保つことを好みます。しかし、私はそれが個人的な好みであると認識しています。

一般に、SQLによって返されるnullを処理する必要がある場合があります。おそらく、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 に答える