caso versus isnull versus coalescência


9

Estou lendo a documentação dos exames do SQL Server 2012 e vi o seguinte ponto:

caso versus isnull versus coalescência

Agora, sei COMO usar cada um, mas não sei QUANDO usar cada um. Por favor, algum corpo poderia esclarecer. Obrigado.

Ps. Por favor, poderíamos ter uma tag para perguntas do exame?


2
COALESCEé expandido para, CASEmas obviamente, em uma CASEdeclaração que você mesmo escreve, pode ser mais flexível nas WHENcondições. Para ISNULLvs COALESCE relacionado / duplicado?
Martin Smith

relacionado eu concordo. mas não dup. Obrigado pelo comentário :)
Stuart Blackler

Respostas:


10

ISNULL - disponível apenas no SQL Server. Permite testar e substituir um valor NULL um pelo outro.

COALESCE - padrão ANSI. Permite o teste e a substituição de um valor NULL pelo primeiro valor não nulo em um conjunto de argumentos de tamanho variável. É importante observar que fatores de precedência do tipo de dados neste

-- 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')

No exemplo acima, 'a' é o primeiro valor não nulo, mas os dados dos caracteres têm precedência menor que o número inteiro.

Outra consideração entre ISNULL vs COALESCE é o resultado de ISNULL NÃO é NULL, enquanto o resultado de uma chamada COALESCE é NULLable. Veja a publicação de JRJ ISNULL () <> COALESCE () Embora isso possa parecer trivial, o otimizador de consultas pode fazer planos diferentes com base na nulidade de uma coluna.

Você pode testar facilmente a nulidade de suas expressões isnull / coalesce / case executando-a no 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 - Também uma função escalar padrão ANSI. Eu usaria o CASE nos dois anteriores quando tenho um teste que não pode ser expresso em um escalar simples, mas essa é uma resposta bastante fraca, admito.


Obrigado pela resposta completa tão rapidamente. Eu não tinha ideia de que a ordem de precedência importava COALESCE. Obrigado novamente
Stuart Blackler

11
CASEé tecnicamente uma expressão, não uma função.
precisa saber é o seguinte

1

ISNULL oferece a possibilidade de retornar 1 repalcement, COALESCE não se limita a um valor, por exemplo, COALESCE(v1,v2,v3,v4,v5) se V5 é o único valor que NÃO é NULL, ele será retornado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.