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



Я разработал запрос, и в результатах для первых трех столбцов я получаю 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
3804   9  

9 ответов:

когда вы хотите заменить, возможно

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

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

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

  1. функция ISNULL и выражение COALESCE имеют аналогичный цели, но может вести себя по-разному.

  2. поскольку ISNULL-это функция, она вычисляется только один раз. Как описанные выше входные значения для выражения COALESCE могут быть оценено несколько раз.

  3. определение типа данных результирующего выражения отличается. ISNULL использует тип данных первого параметра, КОАЛЕСЦИРУЕТ следующим образом выражение CASE управляет и возвращает тип данных значения с помощью более высокий приоритет.

  4. поддерживает ли это выражение, результат индивидуален для функции isnull и СПЛОТИТЬСЯ. Возвращаемое значение функция isnull всегда считается не допускает значения null (предполагая, что возвращаемое значение не является нулевым), тогда как СПЛОТИТЬСЯ с ненулевыми параметрами считается NULL. Так выражения ISNULL(NULL, 1) и COALESCE (NULL, 1) хотя эквиваленты имеют разные значения обнуления. Это делает разница, если вы используете эти выражения в вычисляемых столбцах, создание ключевых ограничений или возвращаемое значение скалярной пользовательской функции детерминированный, чтобы его можно было индексировать, как показано ниже образец.

-- эта инструкция не выполняется, так как первичный ключ не может принять значение NULL ценности -- а поддерживает ли это КОАЛЕСЦИРУЮТ выражение в столбец col2 -- вычисляет значение NULL.

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

-- Это утверждение успешно, потому что обнуление -- ISNULL функция оценивает как 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.

С 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.)

когда вы говорите первые три столбца, вы имеете в виду ваш 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, 

оберните столбец в этот код.

 ISNULL(Yourcolumn, 0)

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

использовать COALESCE, которая возвращает первое не-null значение, например

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

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

самый простой способ-это

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL

добавьте 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
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, и это проблема с этим запросом.

Удачи!

Comments

    Ничего не найдено.