Reemplazar NULL con 0 en una consulta del servidor SQL


175

He desarrollado una consulta y en los resultados de las tres primeras columnas que obtengo NULL. ¿Cómo puedo reemplazarlo 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

@ user2246674 Las primeras tres columnas: suma (caso cuando c.runstatus = 'Succeeded' luego 1 final) como Succeeded, suma (caso cuando c.runstatus = 'Failed' luego 1 final) como Failed, sum (caso cuando c.runstatus = 'Cancelado' luego 1 final) como Cancelado
Bhaskar Mishra

Sparky, Oracle es diferente, no es nulo usar NVL o NVL2 ... consulte oracle-base.com/articles/misc/null-related-functions
KingRider

Respuestas:


376

Cuando desee reemplazar una posible nullcolumna con otra cosa, use IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Esto pondrá un 0 en myColumn si es nulo en primer lugar.


2
Para aquellos que usan SQL Server 2000 o 2005, ISNULL es SQL Server 2008 y superior.
Kyle

1
para varias columnas, ¿tengo que escribir ISNULL varias veces o hay algo como ISNULL (myColumns, 0)?
Flaudre

@Kyle: Eso es incorrecto: por experiencia personal (y una cita de libro ), puedo confirmar que ISNULL es compatible desde (al menos) SQL Server 2000, probablemente incluso antes.
Heinzi

@Flaudre: debe escribir ISNULL varias veces, ya que cada columna de salida debe tener su propia expresión.
Heinzi

Esto también me ayudó a obtener el resultado exacto en SQL Server 2016. Muchas gracias, me alegraron el día @phadaphunk
PatsonLeaner

83

Puede usar ambos métodos, pero hay diferencias:

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

Comparando COALESCE () y ISNULL ():

  1. La función ISNULL y la expresión COALESCE tienen un propósito similar pero pueden comportarse de manera diferente.

  2. Debido a que ISNULL es una función, se evalúa solo una vez. Como se describió anteriormente, los valores de entrada para la expresión COALESCE se pueden evaluar varias veces.

  3. La determinación del tipo de datos de la expresión resultante es diferente. ISNULL usa el tipo de datos del primer parámetro, COALESCE sigue las reglas de expresión CASE y devuelve el tipo de datos de valor con la mayor prioridad.

  4. La NULLability de la expresión del resultado es diferente para ISNULL y COALESCE. El valor de retorno ISNULL siempre se considera NO NULABLE (suponiendo que el valor de retorno sea no anulable) mientras que COALESCE con parámetros no nulos se considera NULL. Entonces las expresiones ISNULL (NULL, 1) y COALESCE (NULL, 1) aunque equivalentes tienen valores de nulabilidad diferentes. Esto hace la diferencia si está utilizando estas expresiones en columnas calculadas, creando restricciones clave o haciendo que el valor de retorno de un UDF escalar sea determinista para que pueda indexarse ​​como se muestra en el siguiente ejemplo.

- Esta declaración falla porque la PRIMARY KEY no puede aceptar valores NULL, y la nulabilidad de la expresión COALESCE para col2 se evalúa como NULL.

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

- Esta declaración tiene éxito porque la nulabilidad de la función - ISNULL evalúa AS NOT NULL.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. Las validaciones para ISNULL y COALESCE también son diferentes. Por ejemplo, un valor NULL para ISNULL se convierte en int, mientras que para COALESCE, debe proporcionar un tipo de datos.

  2. ISNULL toma solo 2 parámetros, mientras que COALESCE toma un número variable de parámetros.

    si necesita saber más aquí está el documento completo de msdn.


23

Con coalesce:

coalesce(column_name,0)

Aunque, en resumen when condition then 1, podría cambiar fácilmente suma count, por ejemplo:

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

( Count(null)devuelve 0, mientras que sum(null)devuelve nulo)


10

Cuando dices las primeras tres columnas, ¿te refieres a tus SUMcolumnas? Si es así, agregue ELSE 0a sus CASEdeclaraciones. El SUMde un NULLvalor es 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, 

8

Una forma simple es

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL

7

Envuelva su columna en este código.

 ISNULL(Yourcolumn, 0)

Tal vez compruebe por qué está obteniendo nulos


6

Uso COALESCE, que devuelve el primer valor no nulo, p. Ej.

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

Establecerá Éxito como 0 si se devuelve como NULL.


1

Agregue un else a sus declaraciones de caso para que su valor predeterminado sea cero si no se encuentra la condición de prueba. Por el momento, si no se encuentra la condición de prueba, se pasa NULL a la función 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

1

Si está utilizando Presto, AWS Athena, etc., no hay función ISNULL (). En cambio, use:

SELECT COALESCE(myColumn, 0 ) FROM myTable

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, 

El problema aquí es que sin la instrucción else, está obligado a recibir un Nulo cuando el estado de ejecución no es el estado indicado en la descripción de la columna. Agregar cualquier cosa a Null dará como resultado Null, y ese es el problema con esta consulta.

¡Buena suerte!


0

siguiendo las respuestas anteriores, estaba perdiendo el nombre de mi columna en el servidor SQL db, sin embargo, seguir esta sintaxis también me ayudó a retener el ColumnName

ISNULL(MyColumnName, 0) MyColumnName
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.