Heim >Backend-Entwicklung >C++ >Wie gehe ich mit Nullwerten in SQL SUM() um, um den Fehler „Die Umwandlung in den Werttyp „Int32' ist fehlgeschlagen' zu vermeiden?

Wie gehe ich mit Nullwerten in SQL SUM() um, um den Fehler „Die Umwandlung in den Werttyp „Int32' ist fehlgeschlagen' zu vermeiden?

DDD
DDDOriginal
2025-01-10 20:36:42196Durchsuche

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

SQL-Ausnahme: „Konvertierung in Werttyp „Int32“ nicht möglich“

In Ihrer SQL-Abfrage versuchen Sie, die Summe der Spalte CreditHistory in der Tabelle Amount für einen bestimmten Benutzer zu berechnen. Wenn für diesen Benutzer jedoch kein Datensatz in der Tabelle CreditHistory vorhanden ist, erhalten Sie die Fehlermeldung: „Kann nicht in den Werttyp „Int32“ konvertiert werden, da der materialisierte Wert null ist.“ Dies liegt daran, dass SQL SUM() einen nullbaren Wert zurückgibt, wenn die zugrunde liegenden Daten Nullwerte enthalten, während C# in Ihrem Ergebnis einen nicht nullbaren int-Typ erwartet.

Um Nullwerte in Abfragen zu verarbeiten und diesen Fehler zu verhindern, können Sie verschiedene Techniken anwenden:

  1. Verwenden Sie DefaultIfEmpty:

    Ändern Sie Ihre Abfrage so, dass sie Sum() verwendet, bevor Sie DefaultIfEmpty(0) anwenden. Dadurch wird sichergestellt, dass das Ergebnis standardmäßig Null und nicht leer ist, wenn ein Datensatz nicht gefunden wird:

    <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. Nullfähige Datentypen verwenden:

    Ändern Sie den Typ der Spalte CreditHistory in der Tabelle Amount in einen Typ, der NULL-Werte zulässt, z. B. int?. Dadurch kann Ihre Abfrage Nullwerte zurückgeben:

    <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. Verwenden Sie COALESCE:

    Verwenden Sie die Funktion COALESCE, um Nullwerte durch angegebene Werte zu ersetzen. In diesem Beispiel können Sie mit ISNULL(ch.Amount, 0) oder COALESCE(ch.Amount, 0) nach Nullwerten suchen und diese in der SQL-Anweisung durch Nullen ersetzen:

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

    Dann erhalten Sie das Ergebnis direkt in C#.

Durch die Anwendung dieser Techniken können Sie Nullwerte in Abfragen effizient verarbeiten und Fehler „Kann nicht in Werttyp konvertieren“ vermeiden. Welche Methode Sie wählen, hängt von Ihren Vorlieben und Ihrem Datenbanksystem ab. Die Methoden 2 und 3 verarbeiten Nullwerte direkter auf der Datenbankseite, während Methode 1 sie auf der C#-Seite verarbeitet.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Nullwerten in SQL SUM() um, um den Fehler „Die Umwandlung in den Werttyp „Int32' ist fehlgeschlagen' zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn