首頁 > 後端開發 > C++ > 如何處理 SQL SUM() 中的空值以避免「轉換為值類型『Int32』失敗」錯誤?

如何處理 SQL SUM() 中的空值以避免「轉換為值類型『Int32』失敗」錯誤?

DDD
發布: 2025-01-10 20:36:42
原創
242 人瀏覽過

How to Handle Null Values in SQL SUM() to Avoid

SQL 異常:'無法轉換為值型別「Int32」'

在您的SQL查詢中,您嘗試計算CreditHistory表中特定使用者的Amount列的總和。但是,當CreditHistory表中沒有該使用者的記錄時,您會遇到錯誤:「無法轉換為值類型'Int32',因為物化值為空」。這是因為當基礎資料包含空值時,SQL SUM() 傳回一個可為空的值,而C#在您的結果中期望一個不可為空的int型別。

為了處理查詢中的空值並防止此錯誤,您可以採用幾種技術:

  1. 使用DefaultIfEmpty

    修改您的查詢以在應用程式Sum()之前使用DefaultIfEmpty(0)。這確保如果找不到記錄,結果預設為零而不是空:

    <code class="language-csharp">var creditsSum = (from u in context.User
                      join ch in context.CreditHistory on u.ID equals ch.UserID
                      where u.ID == userID
                      select ch.Amount).DefaultIfEmpty(0).Sum();</code>
    登入後複製
  2. 使用可空資料型別:

    CreditHistory表中Amount列的類型變更為可空型,例如int?。這允許您的查詢傳回空值:

    <code class="language-csharp">var creditsSum = (from u in context.User
                      join ch in context.CreditHistory on u.ID equals ch.UserID
                      where u.ID == userID
                      select ch.Amount).Sum(); // Sum() will now handle nulls correctly
    ```  或者更简洁的写法:
    
    ```csharp
    var creditsSum = (from u in context.User
                      join ch in context.CreditHistory on u.ID equals ch.UserID
                      where u.ID == userID
                      select ch.Amount).Sum() ?? 0; // 使用null-coalescing operator</code>
    登入後複製
  3. 使用COALESCE

    使用COALESCE函數將空值替換為指定值。在本例中,您可以使用ISNULL(ch.Amount, 0)COALESCE(ch.Amount, 0) 在SQL語句中檢查空值並將其替換為零:

    <code class="language-sql">SELECT ISNULL(SUM(Amount), 0) AS CreditsSum
    FROM CreditHistory
    WHERE UserID = @userID;</code>
    登入後複製

    然後在C#中直接接收結果。

透過應用這些技術,您可以有效地處理查詢中的空值並避免「無法轉換為值類型」錯誤。 選擇哪種方法取決於您的偏好和資料庫系統。 方法2和方法3更直接處理資料庫端的空值,而方法1在C#端處理。

以上是如何處理 SQL SUM() 中的空值以避免「轉換為值類型『Int32』失敗」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板