Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise von NULLIF() in SQL Server

In SQL Server das NULLIF() Ausdruck prüft den Wert von zwei angegebenen Ausdrücken. Es gibt einen Nullwert zurück, wenn sie gleich sind, andernfalls gibt es den ersten Ausdruck zurück.

Syntax

Die Syntax lautet wie folgt:

NULLIF ( expression , expression ) 

Beispiel

Hier ist ein Beispiel zur Veranschaulichung:

SELECT NULLIF(3, 3); 

Ergebnis:

NULL

Hier sind beide Ausdrücke gleich, daher ist das Ergebnis ein Nullwert.

Folgendes passiert, wenn die Ausdrücke nicht gleich sind:

SELECT NULLIF(3, 7); 

Ergebnis:

3

Diesmal wird der erste Wert zurückgegeben.

Hier ist ein Beispiel, das beide Ergebnisse zusammenfasst:

SELECT 
    NULLIF(0, 0) AS a,
    NULLIF(3, 3) AS b,
    NULLIF(3, 0) AS c,
    NULLIF(0, 3) AS d; 

Ergebnis:

+------+------+-----+-----+| ein | b | c | d ||------+------+-----+-----|| NULL | NULL | 3 | 0 |+------+------+-----+-----+

Ein praktisches Beispiel

Angenommen, wir haben eine Tabelle mit den folgenden Daten:

SELECT 
    ProductName,
    ProductPrice
FROM Products; 

Ergebnis:

+------------------------------------+-------- --------+| Produktname | Produktpreis ||--------------------------------------------------+--------- -------|| Linkshänder-Schraubendreher | 25,99 || Langes Gewicht (blau) | 14,75 || Langes Gewicht (grün) | 11,99 || Smash 2000 Vorschlaghammer | 0,00 || Kettensäge (inkl. 3 Ersatzfinger) | 0,00 || Hundebox aus Stroh | NULL || Bodenlose Kaffeetassen (4 Stück) | 9,99 || Rechtshänder-Schraubendreher | 25,99 |+-------------------------------------+--------- -------+(8 Zeilen betroffen)

Angenommen, wir möchten herausfinden, wie viele Produkte einen positiven Preis haben. Mit anderen Worten, wir möchten keine Produkte einschließen, die einen Preis oder Null oder einen Nullwert haben.

Dazu können wir NULLIF() verwenden in Verbindung mit COUNT() Funktion:

SELECT 
    COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products; 

Ergebnis:

+----------+| Ergebnis ||----------|| 5 |+----------+Warnung:Nullwert wird durch eine Aggregat- oder andere SET-Operation eliminiert.

Wir erhalten wie erwartet 5, das ist genau die Anzahl der Zeilen mit einem positiven Wert im ProductPrice Säule.

Das funktioniert, weil COUNT() Die Funktion zählt nur Nicht-Null-Werte. Indem wir die Nullbeträge in Null umwandeln, können wir diese Werte in unserer Berechnung ignorieren.

Hier wieder ohne NULLIF() Funktion.

SELECT COUNT(ProductPrice) AS Result
FROM Products; 

Ergebnis:

+----------+| Ergebnis ||----------|| 7 |+----------+Warnung:Nullwert wird durch eine Aggregat- oder andere SET-Operation eliminiert.

Dieses Mal enthält es die Nullbeträge und wir erhalten 7. Zeile 6 wird immer noch ignoriert, da diese tatsächlich einen Nullwert hat.

Wenn das erste Argument die Null-Konstante ist

Die Funktion akzeptiert die Nullkonstante nicht als erstes Argument:

SELECT NULLIF(null, 3); 

Ergebnis:

Msg 4151, Ebene 16, Status 1, Zeile 1Der Typ des ersten Arguments für NULLIF kann nicht die NULL-Konstante sein, da der Typ des ersten Arguments bekannt sein muss.

Wie die Fehlermeldung besagt, muss der Typ des ersten Arguments bekannt sein. Der Rückgabewert der Funktion verwendet den Datentyp des ersten Ausdrucks, und dieser Fehler spiegelt dies wider.

Dieser Fehler sollte ziemlich selten sein. In den meisten Fällen übergeben Sie als erstes Argument einen Spaltennamen, und in SQL Server haben Spalten einen definierten Datentyp. In solchen Fällen wird tatsächlich ein Nullwert akzeptiert, da SQL Server den Datentyp der Spalte kennt.

Dasselbe könnte man für Variablen sagen. Wenn Sie eine Variable übergeben, müssten Sie ihren Typ deklarieren, und daher würden Sie den Fehler nicht erhalten.

Ungültige Argumentanzahl

Der Aufruf der Funktion ohne Übergabe von Argumenten führt zu einem Fehler:

SELECT NULLIF(); 

Ergebnis:

Msg 102, Level 15, State 1, Line 1Falsche Syntax nahe ')'.

Und das Übergeben zu vieler Argumente verursacht auch einen Fehler:

SELECT NULLIF(1, 2, 3); 

Ergebnis:

Msg 102, Level 15, State 1, Line 1Falsche Syntax in der Nähe von ','.