Co to jest odpowiednik PostgreSQL dla ISNULL ()

254

W MS SQL-Server mogę:

SELECT ISNULL(Field,'Empty') from Table

Ale w PostgreSQL pojawia się błąd składniowy. Jak emulować ISNULL()funkcjonalność?

Byron Whitlock
źródło
1
Nie, nie możesz tego zrobić w MSSQL. Ten kod nie będzie się kompilował. ISNULLpobiera dwa argumenty i zwraca, że ​​drugi to pierwszy null, w przeciwnym razie pierwszy.
GSerg
@GSerg, masz rację. naprawiłem to.
Byron Whitlock,
Gserg i Byron tak, można zobaczyć tutaj Przykład z mojego komputera SELECT isnull (a.FechaEntregada, '') jako test z dbo.Amonestacion a msdn.microsoft.com/en-us/library/ms184325.aspx
Juan

Odpowiedzi:

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

Lub bardziej idiomatycznie:

SELECT coalesce(field, 'Empty') AS field_alias
Kyle Butt
źródło
49
+1 dla coalesce. (PS Możesz to zrobić również w MS SQL Server.)
Alison R.
2
Istnieją jednak inne przypadki korzystania z IS NULL, więc dobrze jest wiedzieć oba.
Kyle Butt,
30
Myślę, że warto zauważyć, że jest coalesceto standard SQL, isnullponieważ jest to funkcja specyficzna dla MS, która zasadniczo ma coalescetylko dwa parametry.
GSerg
4
Coalesce () również poprawnie obsługuje promocję typu (dokładnie tak, jak robi to UNION SELECT), podczas gdy IsNull () nie.
ErikE
2
Warto zauważyć, że ISNULL i WSPÓŁPRACA to nie to samo. IsNull wymusza typ wyniku na typ argumentu1, podczas gdy łączenie używa odpowiednich typów dla każdego argumentu. Jeśli wystarczy wyszukać i zamień IsNull z coalesce można potencjalnie uzyskać wiele błędów ...
Stefan Steiger
75

COALESCE()Zamiast tego użyj :

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

Działa podobnie ISNULL, chociaż zapewnia większą funkcjonalność. Coalesce zwróci pierwszą wartość inną niż null na liście. A zatem:

SELECT COALESCE(null, null, 5); 

zwraca 5, podczas gdy

SELECT COALESCE(null, 2, 5);

zwraca 2

Coalesce przyjmie wiele argumentów. Nie ma udokumentowanego maksimum. Przetestowałem to będzie 100 argumentów i udało się. To powinno wystarczyć w zdecydowanej większości sytuacji.

Jim Clouse
źródło
24

Jak emulować funkcjonalność ISNULL ()?

SELECT (Field IS NULL) FROM ...
Artur
źródło
4
To emuluje dokładną funkcjonalność isnull, nie jestem pewien, dlaczego jest to przegłosowane
smackshow
Oczywiście najlepsza odpowiedź na pytanie. To wyrażenie jest pełnym odpowiednikiem ISNULL (). COALESCE () jest bardzo inteligentny i interesujący, ale nie może wykonać ISNULL (), gdy jest zamknięty.
Skrol29
16
Nie wiem, do czego ISNULLodwołują się Twoi komentatorzy, ale field IS NULLpodaje wartość logiczną, podczas gdy ISNULLw SQL Server działa tak COALESCE: zwraca jedną z nie- NULLwartości. Ta odpowiedź jest strasznie błędna. Zapoznaj się z dokumentacją: ISNULL.
jpmc26
10
Podejrzewam, że tymi komentatorami są użytkownicy MySQL, którzy nie zdawali sobie sprawy, że pytanie zaczyna się od: „W MS SQL Server, ...” MySQL ma funkcję ISNULL (), która pobiera pojedynczy argument i zwraca 0 lub 1. Wersja T-SQL przyjmuje dwa argumenty i zachowuje się jak COALESCE lub Oracle's NVL.
David Noha,
1
greatvovan, Niezależnie od tego, czy taka była intencja oryginalnego plakatu, wierzę, że ludzie chcą odpowiedzi na pytanie „Jak sprawdzić, czy pole jest puste”, niekoniecznie „Jak dokładnie działa funkcja ISNULL”. Tak było ze mną i ta odpowiedź jest do tego idealna.
Freeman Helmuth
15

Próbować:

SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name
użytkownik2718914
źródło
3
Jest to miłe, ponieważ dotyczy przypadku, gdy pole tekstowe NIE jest puste, ale również „puste”.
soulia,
-9

Utwórz następującą funkcję

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'

I to zadziała.

Możesz tworzyć różne wersje z różnymi typami parametrów.


źródło
28
Proszę, nikt tego nie robi. Zamiast tego używaj coalesce (), aby Twój DBA cię nie nienawidził.
Jordan
1
postgres dodaj isnull, aby nikt nikogo nie nienawidził.
Eric Twilegar