W MySQL czasami nie chcesz, aby wartości NULL były zwracane jako NULL
. Czasami chcesz, aby wartości NULL były zwracane z inną wartością, na przykład „Nie dotyczy”, „Nie dotyczy”, „Brak” lub nawet pustym ciągiem „”.
Na szczęście w MySQL można to zrobić na kilka sposobów.
Oto cztery:
IFNULL()
funkcjaCOALESCE()
funkcjaIF()
funkcja połączona zIS NULL
(lubIS NOT NULL
) operatorCASE
wyrażenie połączone zIS NULL
(lubIS NOT NULL
) operator
Przykłady tych opcji znajdują się poniżej.
Przykładowe dane
Najpierw weźmy przykładowe dane:
USE Solutions; SELECT TaskCode From Tasks;
Wynik:
+----------+ | TaskCode | +----------+ | gar123 | | NULL | | NULL | | dog456 | | NULL | | cat789 | +----------+
Mamy więc trzy wartości NULL i trzy wartości inne niż NULL.
Funkcja IFNULL()
Biorąc pod uwagę jego nazwę, jest to prawdopodobnie najbardziej oczywista opcja zastępowania wartości NULL w MySQL. Ta funkcja jest zasadniczo odpowiednikiem ISNULL()
w SQL Server.
IFNULL()
funkcja umożliwia podanie dwóch argumentów. Pierwszy argument jest zwracany tylko wtedy, gdy nie ma wartości NULL. Jeśli ma wartość NULL, zamiast tego zwracany jest drugi argument.
Oto przykład użycia IFNULL()
w porównaniu z naszym przykładowym zestawem danych:
SELECT IFNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Wynik:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Tutaj po prostu zastąpiliśmy wartości NULL przez N/A
.
Funkcja COALESCE()
Ta funkcja jest podobna do IFNULL()
funkcja, ale nieco inna. Ta funkcja jest zgodna ze standardem ANSI SQL i jest szeroko wdrażana w różnych systemach RDBMS.
Działa to tak, że podajesz tyle argumentów, ile potrzebujesz. COALESCE()
zwróci wtedy pierwszą wartość inną niż NULL
wartość na liście lub NULL
jeśli nie ma wartości innych niż NULL
wartości.
Tak:
SELECT COALESCE(TaskCode, 'N/A') AS Result FROM Tasks;
Wynik:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Otrzymujemy więc dokładnie ten sam wynik, co poprzednio.
Jednak różnica w przypadku tej funkcji polega na tym, że, jak wspomniano, możesz podać listę argumentów. COALESCE()
funkcja przyjmie pierwszą wartość inną niż NULL.
Na przykład możemy dodać NULL
jako pierwszy argument i umieść None
przed N/A
i zobacz, co się dzieje:
SELECT COALESCE(NULL, TaskCode, 'None', 'N/A') AS Result FROM Tasks;
Wynik:
+--------+ | Result | +--------+ | gar123 | | None | | None | | dog456 | | None | | cat789 | +--------+
Pominął pierwszy NULL
zgodnie z oczekiwaniami, pominął wszystkie wartości NULL w TaskCode
kolumna, przed ustawieniem na None
. N/A
wartość nie została w tym przypadku użyta, ponieważ None
był pierwszy i nie ma wartości NULL.
Funkcja IF() w połączeniu z IS NULL/IS NOT NULL
IS NULL
i IS NOT NULL
Operatory umożliwiają testowanie pod kątem wartości NULL i prezentowanie różnych wartości w zależności od wyniku.
Możemy użyć tych operatorów wewnątrz IF()
funkcji, dzięki czemu zwracane są wartości inne niż NULL, a wartości NULL są zastępowane przez wybraną przez nas wartość.
Przykład:
SELECT IF(TaskCode IS NOT NULL, TaskCode, 'N/A') AS Result FROM Tasks;
Wynik:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Czyli taki sam wynik jak w przypadku IFNULL()
i COALESCE()
funkcje.
I oczywiście możemy zamienić IS NOT NULL
z IS NULL
. Jeśli to zrobimy, będziemy musieli zamienić również kolejne argumenty:
SELECT IF(TaskCode IS NULL, 'N/A', TaskCode) AS Result FROM Tasks;
Wyrażenie CASE w połączeniu z IS NULL/IS NOT NULL
Innym sposobem na to jest użycie CASE
wyrażenie:
SELECT CASE WHEN TaskCode IS NOT NULL THEN TaskCode ELSE 'N/A' END AS Result FROM Tasks;
Wynik:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Podobnie jak w poprzednim przykładzie, można to przepisać, używając IS NULL
zamiast IS NOT NULL
:
SELECT CASE WHEN TaskCode IS NULL THEN 'N/A' ELSE TaskCode END AS Result FROM Tasks;