Substituindo NULL por 0 em uma consulta do servidor SQL

175

Eu desenvolvi uma consulta e nos resultados das três primeiras colunas que recebo NULL. Como posso substituí-lo 0?

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate
Bhaskar Mishra
fonte
@ user2246674 As três primeiras colunas: sum (caso em que c.runstatus = 'Bem-sucedido' e depois 1 final) como Bem-sucedido, soma (caso em que c.runstatus = 'Falha' e depois 1 final) como Falha, soma (caso em que c.runstatus = 'cancelado', em seguida, 1 fim) como cancelada
Bhaskar Mishra
Sparky, o Oracle é diferente e não é nulo usar NVL ou NVL2 ... verifique oracle-base.com/articles/misc/null-related-functions
KingRider

Respostas:

376

Quando você quiser substituir uma nullcoluna possivelmente por outra, use IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Isso colocará um 0 em myColumn se for nulo em primeiro lugar.

phadaphunk
fonte
2
Para aqueles que usam o SQL Server 2000 ou 2005, o ISNULL é o SQL Server 2008 e superior.
Kyle
1
para várias colunas, tenho que escrever ISNULL várias vezes ou existe algo como ISNULL (myColumns, 0)?
Flaudre
@ Kyle: Isso está incorreto: Por experiência pessoal (e uma cotação de livro ), posso confirmar que o ISNULL é suportado desde (pelo menos) o SQL Server 2000, provavelmente até mais cedo.
Heinzi
@ Flaudre: Você deve escrever ISNULL várias vezes, pois cada coluna de saída deve ter sua própria expressão.
Heinzi
Isto ajuda-me bem para obter o resultado preciso em SQL Server 2016. Muito obrigado, você apenas fez meu dia @phadaphunk
PatsonLeaner
83

Você pode usar os dois métodos, mas existem diferenças:

SELECT ISNULL(col1, 0 ) FROM table1
SELECT COALESCE(col1, 0 ) FROM table1

Comparando COALESCE () e ISNULL ():

  1. A função ISNULL e a expressão COALESCE têm um objetivo semelhante, mas podem se comportar de maneira diferente.

  2. Como ISNULL é uma função, ela é avaliada apenas uma vez. Como descrito acima, os valores de entrada para a expressão COALESCE podem ser avaliados várias vezes.

  3. A determinação do tipo de dados da expressão resultante é diferente. ISNULL usa o tipo de dados do primeiro parâmetro, COALESCE segue as regras de expressão CASE e retorna o tipo de dados do valor com a maior precedência.

  4. A capacidade NULL da expressão do resultado é diferente para ISNULL e COALESCE. O valor de retorno ISNULL é sempre considerado NOT NULLable (assumindo que o valor de retorno não seja nulo), enquanto COALESCE com parâmetros não nulos é considerado NULL. Portanto, as expressões ISNULL (NULL, 1) e COALESCE (NULL, 1), embora equivalentes, têm valores de anulabilidade diferentes. Isso faz diferença se você estiver usando essas expressões em colunas computadas, criando restrições de chave ou tornando o valor de retorno de um UDF escalar determinístico, para que possa ser indexado, conforme mostrado no exemplo a seguir.

- Essa instrução falha porque a PRIMARY KEY não pode aceitar valores NULL - e a nulidade da expressão COALESCE para col2 - é avaliada como NULL.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0) PRIMARY KEY, 
    col3 AS ISNULL(col1, 0) 
); 

- Esta instrução é bem-sucedida porque a capacidade de nulidade da função - ISNULL avalia AS NOT NULL.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. As validações para ISNULL e COALESCE também são diferentes. Por exemplo, um valor NULL para ISNULL é convertido em int, enquanto que para COALESCE, você deve fornecer um tipo de dados.

  2. ISNULL usa apenas 2 parâmetros, enquanto COALESCE usa um número variável de parâmetros.

    Se você precisar saber mais, aqui está o documento completo do msdn.

Mojtaba Rezaeian
fonte
23

Com coalesce:

coalesce(column_name,0)

Embora, em síntese when condition then 1, você possa mudar com suma mesma facilidade para count- por exemplo:

count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,

( Count(null)retorna 0, enquanto sum(null)retorna nulo.)


fonte
10

Quando você diz as três primeiras colunas, você quer dizer suas SUMcolunas? Em caso afirmativo, adicione ELSE 0suas CASEdeclarações. A SUMde um NULLvalor é NULL.

sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 
sgeddes
fonte
8

Uma maneira simples é

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL
Umang Patwa
fonte
7

Quebra sua coluna neste código.

 ISNULL(Yourcolumn, 0)

Talvez verifique por que você está recebendo nulos

Bobby
fonte
6

Use COALESCE, que retorna o primeiro valor não nulo, por exemplo

SELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeeded

Definirá Succeeded como 0 se for retornado como NULL.

dKen
fonte
1

Adicione um outro às suas instruções de caso para que elas sejam padronizadas como zero se a condição de teste não for encontrada. No momento, se a condição de teste não for encontrada, NULL está sendo passado para a função SUM ().

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate
Lobo mau
fonte
1

Se você estiver usando o Presto, o AWS Athena etc., não há função ISNULL (). Em vez disso, use:

SELECT COALESCE(myColumn, 0 ) FROM myTable
Gaz_Edge
fonte
0
sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 

o problema aqui é que, sem a instrução else, você receberá um Nulo quando o status de execução não for o status indicado na descrição da coluna. Adicionar algo ao Null resultará em Null, e esse é o problema desta consulta.

Boa sorte!

Krishna Chavali
fonte
0

seguindo as respostas anteriores, eu estava perdendo o nome da minha coluna no banco de dados SQL do servidor, no entanto, seguir esta sintaxe me ajudou a manter o ColumnName também

ISNULL(MyColumnName, 0) MyColumnName
Camaleão
fonte