przypadek kontra isnull versus łączenie

9

Właśnie czytam dokumentację do egzaminów SQL Server 2012 i zobaczyłem następujący punkt:

przypadek kontra isnull versus łączenie

Teraz wiem, JAK z nich korzystać, ale nie wiem KIEDY z nich korzystać. Proszę o wyjaśnienie. Dzięki.

Ps. Czy możemy mieć tag do pytań egzaminacyjnych?

Stuart Blackler
źródło
2
COALESCEjest rozwinięty do, CASEale oczywiście w CASEoświadczeniu, które sam piszesz, możesz być bardziej elastyczny w WHENwarunkach. Dla ISNULLkontra COALESCE pokrewnych / zduplikowanych?
Martin Smith,
powiązane Zgadzam się. ale nie dup. Dzięki za komentarz :)
Stuart Blackler,

Odpowiedzi:

10

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ę.

billinkc
źródło
Dzięki za pełną odpowiedź tak szybko. Nie miałem pojęcia, że ​​kolejność pierwszeństwa ma znaczenie COALESCE. Jeszcze raz dziękuję
Stuart Blackler,
1
CASEjest technicznie wyrażeniem, a nie funkcją.
ypercubeᵀᴹ
1

ISNULL daje możliwość zwrotu 1 repalcement, COALESCE nie jest ograniczony do jednej wartości, np. COALESCE(v1,v2,v3,v4,v5) Jeśli V5 jest jedyną wartością, która NIE jest NULL, zostanie zwrócona

bummi
źródło