MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

SQL NULLIF() erklärt

Die meisten großen RDBMS unterstützen NULLIF() -Operator, der NULL zurückgibt wenn beide Argumente äquivalent sind. Wenn die Argumente nicht äquivalent sind, NULLIF() gibt das erste Argument zurück.

NULLIF() ist eine SQL-Standardfunktion (in der ISO/IEC 9075-Spezifikation enthalten).

Syntax

Die Syntax lautet wie folgt:

NULLIF (V1, V2)

Dies entspricht dem folgenden CASE Ausdruck:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Beispiel

Hier ist ein Beispiel zur Veranschaulichung:

SELECT NULLIF( 12, 12 );

Ergebnis:

NULL

In diesem Fall sind beide Argumente identisch und daher ist das Ergebnis NULL .

Abhängig von Ihrem RDBMS kann die tatsächliche Ausgabe für NULL-Werte unterschiedlich sein. Beispielsweise wird bei der Verwendung von psql (für PostgreSQL) standardmäßig immer dann der leere String ausgegeben, wenn ein NULL-Wert zurückgegeben wird (dies kann jedoch geändert werden). Dasselbe gilt für SQLite (und das kann auch geändert werden).

Wenn die Argumente nicht gleichwertig sind

Folgendes passiert, wenn die Argumente nicht äquivalent sind:

SELECT NULLIF( 12, 13 );

Ergebnis:

12

Die Argumente sind unterschiedlich und daher wird das erste Argument zurückgegeben.

Strings

Hier ist ein Beispiel, das Strings vergleicht:

SELECT 
    NULLIF( 'Gym', 'Gym' ) AS "Same",
    NULLIF( 'Gym', 'Bag' ) AS "Different";

Ergebnis:

+------+-----------+
| Same | Different |
+------+-----------+
| NULL | Gym       |
+------+-----------+

Termine

Hier ist ein Beispiel, das Datumsangaben vergleicht:

SELECT 
    NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
    NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";

Ergebnis:

+------+------------+
| Same | Different  |
+------+------------+
| NULL | 2045-11-25 |
+------+------------+

Ausdrücke

NULLIF() wertet den aktuellen Wert der Ausdrücke aus. Wenn wir also einen Ausdruck wie diesen übergeben:

SELECT NULLIF( 24, 2 * 12 );

Wir bekommen das:

NULL

2 multipliziert mit 12 ergibt 24, also sind die beiden Argumente äquivalent.

Folgendes passiert, wenn wir das zweite Argument ändern:

SELECT NULLIF( 24, 3 * 12 );

Ergebnis:

24

Das erste Argument wird zurückgegeben.

Ein Datenbankbeispiel

Angenommen, wir führen die folgende Abfrage aus:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
ORDER BY Name;

Ergebnis:

+------------------+-------------------+
| Name             | LocalName         |
+------------------+-------------------+
| Argentina        | Argentina         |
| Bolivia          | Bolivia           |
| Brazil           | Brasil            |
| Chile            | Chile             |
| Colombia         | Colombia          |
| Ecuador          | Ecuador           |
| Falkland Islands | Falkland Islands  |
| French Guiana    | Guyane française  |
| Guyana           | Guyana            |
| Paraguay         | Paraguay          |
| Peru             | Perú/Piruw        |
| Suriname         | Suriname          |
| Uruguay          | Uruguay           |
| Venezuela        | Venezuela         |
+------------------+-------------------+

Hier haben wir in der linken Spalte Ländernamen und in der rechten den lokalen Namen für das jeweilige Land.

Lassen Sie uns NULLIF() hinzufügen zu einer dritten Spalte unserer Abfrage:

SELECT
    Name,
    LocalName,
    NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country 
WHERE Region = 'South America'
ORDER BY Name;

Ergebnis:

+------------------+-------------------+-------------------------+
| Name             | LocalName         | Local Name if Different |
+------------------+-------------------+-------------------------+
| Argentina        | Argentina         | NULL                    |
| Bolivia          | Bolivia           | NULL                    |
| Brazil           | Brasil            | Brasil                  |
| Chile            | Chile             | NULL                    |
| Colombia         | Colombia          | NULL                    |
| Ecuador          | Ecuador           | NULL                    |
| Falkland Islands | Falkland Islands  | NULL                    |
| French Guiana    | Guyane française  | Guyane française        |
| Guyana           | Guyana            | NULL                    |
| Paraguay         | Paraguay          | NULL                    |
| Peru             | Perú/Piruw        | Perú/Piruw              |
| Suriname         | Suriname          | NULL                    |
| Uruguay          | Uruguay           | NULL                    |
| Venezuela        | Venezuela         | NULL                    |
+------------------+-------------------+-------------------------+

Wir können sehen, dass die dritte Spalte den lokalen Namen nur zurückgibt, wenn er sich von dem Wert in Name unterscheidet Säule. Wenn es gleich ist, dann NULL zurückgegeben wird.

Wir können auch NULLIF() verwenden So filtern Sie unsere Abfrageergebnisse:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;

Ergebnis:

+---------------+-------------------+
| Name          | LocalName         |
+---------------+-------------------+
| Brazil        | Brasil            |
| French Guiana | Guyane française  |
| Peru          | Perú/Piruw        |
+---------------+-------------------+

In diesem Fall haben wir nur die Zeilen zurückgegeben, in denen sich der lokale Name von Name unterscheidet Spalte.

NULLIF() vs. CASE

Wie bereits erwähnt, der folgende Code:

NULLIF (V1, V2)

entspricht dem folgenden CASE Ausdruck:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Es ist also möglich, einen CASE zu verwenden Ausdruck anstelle von NULLIF() falls gewünscht. Das NULLIF() Funktion ist im Grunde eine syntaktische Abkürzung für den CASE Ausdruck.

So könnten wir beispielsweise das vorherige Beispiel durch Folgendes ersetzen:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
AND (CASE WHEN LocalName = Name THEN NULL ELSE LocalName END) IS NOT NULL
ORDER BY Name;

Ergebnis:

+---------------+-------------------+
| Name          | LocalName         |
+---------------+-------------------+
| Brazil        | Brasil            |
| French Guiana | Guyane française  |
| Peru          | Perú/Piruw        |
+---------------+-------------------+

Allerdings ist das NULLIF() Funktion ist viel prägnanter.

Falsche Parameteranzahl

Das Übergeben der falschen Anzahl von Argumenten führt zu einem Fehler:

SELECT NULLIF( 'One' );

Ergebnis in MySQL:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'