Was ist das PostgreSQL-Äquivalent für ISNULL ()


255

In MS SQL-Server kann ich Folgendes tun:

SELECT ISNULL(Field,'Empty') from Table

Aber in PostgreSQL bekomme ich einen Syntaxfehler. Wie emuliere ich die ISNULL()Funktionalität?


1
Nein, das können Sie in MSSQL nicht. Dieser Code wird nicht kompiliert. ISNULLnimmt zwei Argumente und gibt zurück, das zweite ist das erste null, andernfalls das erste.
GSerg

@ GSerg, du hast recht. das behoben.
Byron Whitlock

Gserg und Byron ja, Sie können hier ein Beispiel von meinem PC sehen. SELECT isnull (a.FechaEntregada, '') als Test von dbo.Amonestacion a msdn.microsoft.com/en-us/library/ms184325.aspx
Juan

Antworten:


453
SELECT CASE WHEN field IS NULL THEN 'Empty' ELSE field END AS field_alias

Oder idiomatischer:

SELECT coalesce(field, 'Empty') AS field_alias

49
+1 für coalesce. (PS Sie können das auch in MS SQL Server tun.)
Alison R.

2
Es gibt jedoch auch andere Fälle für die Verwendung von IS NULL. Daher ist es gut, beide zu kennen.
Kyle Butt

30
Ich denke, es ist erwähnenswert, dass es sich coalesceum einen SQL-Standard handelt, bei dem isnulles sich um eine MS-spezifische Funktion handelt, die im Wesentlichen coalescenur aus zwei Parametern besteht.
GSerg

4
Coalesce () behandelt auch die Typwerbung ordnungsgemäß (genau wie UNION SELECT), IsNull () jedoch nicht.
ErikE

2
Es sei darauf hingewiesen, dass ISNULL und COALESCE nicht dasselbe sind. IsNull erzwingt den Ergebnistyp auf den Typ von Argument1, während Coalesce die jeweiligen Typen für jedes Argument verwendet. Wenn Sie nur suchen und ersetzen, ist nicht mit Koaleszenz verbunden, können Sie möglicherweise viele Fehler bekommen ...
Stefan Steiger

76

Verwenden Sie COALESCE()stattdessen:

SELECT COALESCE(Field,'Empty') from Table;

Es funktioniert ähnlich ISNULL, bietet jedoch mehr Funktionalität. Coalesce gibt den ersten Wert ungleich Null in der Liste zurück. So:

SELECT COALESCE(null, null, 5); 

gibt 5 zurück, während

SELECT COALESCE(null, 2, 5);

gibt 2 zurück

Coalesce wird eine große Anzahl von Argumenten annehmen. Es gibt kein dokumentiertes Maximum. Ich habe es mit 100 Argumenten getestet und es ist gelungen. Dies sollte für die überwiegende Mehrheit der Situationen ausreichend sein.


24

Wie emuliere ich die ISNULL () -Funktionalität?

SELECT (Field IS NULL) FROM ...

4
Dies emuliert die genaue Funktionalität von isnull, nicht sicher, warum es downvoted ist
smackshow

Die beste Antwort auf die Frage natürlich. Dieser Ausdruck entspricht vollständig ISNULL (). COALESCE () ist sehr intelligent und interessant zu wissen, kann jedoch kein ISNULL () ausführen, solange es geschlossen ist.
Skrol29

17
Ich weiß nicht, worauf sich ISNULLIhre Kommentatoren beziehen, field IS NULLgibt aber einen booleschen Wert an, während ISNULLin SQL Server Folgendes funktioniert COALESCE: Es wird einer der Nichtwerte zurückgegeben NULL. Diese Antwort ist schrecklich falsch. Siehe Dokumentation : ISNULL.
jpmc26

10
Ich vermute, diese Kommentatoren sind MySQL-Benutzer, denen nicht klar war, dass die Frage mit "In MS SQL Server, ..." beginnt. MySQL verfügt über eine ISNULL () -Funktion, die ein einzelnes Argument akzeptiert und 0 oder 1 zurückgibt. Die Version von T-SQL nimmt zwei Argumente und verhält sich wie COALESCE oder Oracle NVL.
David Noha

1
greatvovan, Ob ​​dies die Absicht des Originalplakats war oder nicht, ich glaube, was die Leute wollen, ist die Antwort auf "Wie überprüfe ich, ob ein Feld null ist", nicht unbedingt auf "Wie genau funktioniert die ISNULL-Funktion?". Das war bei mir der Fall und diese Antwort ist perfekt dafür.
Freeman Helmuth

15

Versuchen:

SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name

3
Dies ist schön, da es den Fall abdeckt, in dem ein Textfeld NICHT null, sondern auch 'leer' ist.
Soulia

-9

Erstellen Sie die folgende Funktion

CREATE OR REPLACE FUNCTION isnull(text, text) RETURNS text AS 'SELECT (CASE (SELECT $1 "
    "is null) WHEN true THEN $2 ELSE $1 END) AS RESULT' LANGUAGE 'sql'

Und es wird funktionieren.

Sie können verschiedene Versionen mit verschiedenen Parametertypen erstellen.


28
Bitte, niemand macht das. Verwenden Sie stattdessen coalesce (), damit Ihr DBA Sie nicht hasst.
Jordanien

1
postgres bitte füge isnull hinzu, damit niemand jemanden hasst.
Eric Twilegar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.