Замена NULL на 0 в запросе SQL-сервера

Я разработал запрос, а в результатах для первых трех столбцов я получаю NULL. Как заменить его на 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

Ответ 1

Если вы хотите заменить столбец возможно null чем-то другим, используйте IsNull.

SELECT ISNULL(myColumn, 0 ) FROM myTable

Это положит 0 в myColumn, если вначале это значение равно null.

Ответ 2

Вы можете использовать оба этих метода, но есть различия:

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

Сравнение COALESCE() и ISNULL():

  • Функция ISNULL и выражение COALESCE имеют аналогичные но может вести себя по-другому.

  • Поскольку ISNULL является функцией, она оценивается только один раз. В виде описанных выше, входные значения для выражения COALESCE могут быть оценивается несколько раз.

  • Определение типа данных для полученного выражения отличается. ISNULL использует тип данных первого параметра, COALESCE следует правила выражения CASE и возвращает тип данных с помощью наивысший приоритет.

  • NULLability выражения результата отличается для ISNULL и COALESCE. Возвращаемое значение ISNULL всегда считается NOT NULLable (предполагая, что возвращаемое значение является невообразимым), тогда как COALESCE с ненулевыми параметрами считается NULL. Итак выражения ISNULL (NULL, 1) и COALESCE (NULL, 1), хотя эквивалентные имеют разные значения неопределенности. Это делает разница, если вы используете эти выражения в вычисленных столбцах, создание ключевых ограничений или создание возвращаемого значения скалярного UDF детерминированным, чтобы его можно было проиндексировать, как показано в следующем Пример.

- этот оператор терпит неудачу, потому что PRIMARY KEY не может принимать значения NULL - и недействительность выражения COALESCE для col2 - вычисляет значение NULL.

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

- Это утверждение выполняется успешно, поскольку недействительность - Функция ISNULL вычисляет AS NOT NULL.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. Валидации для ISNULL и COALESCE также различны. Например, значение NULL для ISNULL преобразуется в int, тогда как для COALESCE, вы должны указать тип данных.

  2. ISNULL принимает только 2 параметра, тогда как COALESCE принимает переменную количество параметров.

    если вам нужно знать больше вот полный документ из msdn.

Ответ 3

С coalesce:

coalesce(column_name,0)

Хотя, суммируя when condition then 1, вы можете так же легко изменить sum на count - например:

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

(Count(null) возвращает 0, а sum(null) возвращает null.)

Ответ 4

Когда вы говорите первые три столбца, вы имеете в виду ваши столбцы SUM? Если это так, добавьте ELSE 0 в свои CASE заявления. Значение SUM значения NULL равно 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, 

Ответ 5

Вставьте этот столбец в этот код.

 ISNULL(Yourcolumn, 0)

Возможно, проверьте, почему вы получаете нули

Ответ 6

Используйте COALESCE, который возвращает первое непустое значение, например.

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

Будет установлен преемник как 0, если он возвращается как NULL.

Ответ 7

Добавьте else в свои аргументы case, чтобы они по умолчанию были равны нулю, если условие проверки не найдено. На данный момент, если условие проверки не найдено, NULL передается функции 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

Ответ 8

Простой способ

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL

Ответ 9

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, 

проблема заключается в том, что без инструкции else вы обязаны получать Null, если статус прогона не является указанным статусом в описании столбца. Добавление чего-либо к Null приведет к Null, и это проблема с этим запросом.

Удачи!