ISNULL - dostępny tylko w SQL Server. Pozwala na testowanie i zamianę wartości NULL na inną.
COALESCE - standard ANSI. Umożliwia testowanie i zamianę wartości NULL na pierwszą wartość inną niż null w zestawie argumentów o zmiennej długości. Ważne jest, aby pamiętać, że czynniki wpływające na to mają wpływ na typ danych
-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1)
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')
W powyższym przykładzie „a” jest pierwszą wartością inną niż null, ale dane znakowe mają niższy priorytet niż liczba całkowita.
Inną kwestią między ISNULL a COALESCE jest to, że wynik ISNULL jest określony jako NIE NULL, podczas gdy wynik wywołania COALESCE jest NULLable. Zobacz post JRJ ISNULL () <> COALESCE () Chociaż może się to wydawać trywialne, optymalizator zapytań może tworzyć różne plany na podstawie nullability kolumny.
Możesz łatwo przetestować zerowalność wyrażeń isnull / coalesce / case, uruchamiając je za pomocą dmo sys.dm_exec_describe_first_result_set
-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
DMO.*
FROM
sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO
CASE - Również standardowa funkcja skalarna ANSI. Przyglądałbym się używaniu CASE z poprzednich dwóch, gdy mam test, którego nie można wyrazić prostym skalarem, ale to dość słaba odpowiedź, przyznaję.
COALESCE
jest rozwinięty do,CASE
ale oczywiście wCASE
oświadczeniu, które sam piszesz, możesz być bardziej elastyczny wWHEN
warunkach. DlaISNULL
kontraCOALESCE
pokrewnych / zduplikowanych?