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ść?


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

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.


24

Jak emulować funkcjonalność ISNULL ()?

SELECT (Field IS NULL) FROM ...

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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.