Podczas wykonywania zapytań do bazy danych SQL Server mogą wystąpić sytuacje, w których nie chcesz, aby w zestawie wyników były zwracane wartości null. I mogą być chwile, w których chcesz, aby je zwrócono. Ale mogą być również sytuacje, w których chcesz je zwrócić, ale jako inną wartość.
To właśnie ISNULL()
funkcja jest przeznaczona.
ISNULL()
to funkcja T-SQL, która umożliwia zastąpienie NULL
z określoną wartością do wyboru.
Przykład
Oto podstawowe zapytanie, które zwraca mały zestaw wyników:
SELECT TaskCode AS Result FROM Tasks;
Wynik:
Result ------ cat123 null null pnt456 rof789 null
Widzimy, że istnieją trzy wiersze zawierające wartości null.
Jeśli nie chcielibyśmy, aby wartości null pojawiały się jako takie, moglibyśmy użyć ISNULL()
zastąpić null
z inną wartością.
Tak:
SELECT ISNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Wynik:
Result ------ cat123 N/A N/A pnt456 rof789 N/A
Możemy również zastąpić go pustym ciągiem:
SELECT ISNULL(TaskCode, '') AS Result FROM Tasks;
Wynik:
Result ------ cat123 pnt456 rof789
Zauważ, że ISNULL()
wymaga, aby drugi argument był typu, który można niejawnie przekonwertować na typ danych pierwszego argumentu. Dzieje się tak, ponieważ zwraca wynik przy użyciu typu danych pierwszego argumentu.
Zapobieganie znikaniu pustych wierszy
Istnieje kilka funkcji T-SQL, w których wartości null są eliminowane z zestawu wyników. W takich przypadkach wartości null w ogóle nie zostaną zwrócone.
Chociaż w niektórych przypadkach może to być pożądany wynik, w innych może to być katastrofalne, w zależności od tego, co musisz zrobić z danymi po ich zwróceniu.
Jednym z przykładów takiej funkcji jest STRING_AGG()
. Ta funkcja umożliwia zwrócenie zestawu wyników w postaci rozdzielanej listy. Jednak eliminuje również wartości null z zestawu wyników. Więc jeśli użyjemy tej funkcji z powyższymi przykładowymi danymi, otrzymalibyśmy trzy wyniki zamiast sześciu:
SELECT STRING_AGG(TaskCode, ', ') AS Result FROM Tasks;
Wynik:
Result ---------------------- cat123, pnt456, rof789
Tak więc trzy wiersze zawierające wartości null nie są zwracane.
W wielu przypadkach jest to doskonały wynik, ponieważ nasz zestaw wyników nie jest zaśmiecony wartościami null. Może to jednak również powodować problemy, w zależności od tego, do czego dane będą wykorzystywane.
Dlatego, jeśli chcemy zachować wiersze z wartościami null, możemy użyć ISNULL()
aby zastąpić wartości null inną wartością:
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
Wynik:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Funkcja COALESCE()
ISNULL()
funkcja działa podobnie do COALESCE()
funkcjonować. Możemy więc zastąpić powyższy kod następującym:
SELECT STRING_AGG(COALESCE(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
I uzyskaj ten sam wynik:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Istnieją jednak pewne różnice w zachowaniu tych dwóch funkcji. Aby uzyskać więcej informacji na temat różnic, oto porównanie COALESCE()
i ISNULL()
na stronie Microsoft.