Замена 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
9 ответов:
вы можете использовать оба этих метода, но есть различия:
SELECT ISNULL(col1, 0 ) FROM table1 SELECT COALESCE(col1, 0 ) FROM table1сравнение COALESCE() и ISNULL ():
функция ISNULL и выражение COALESCE имеют аналогичный цели, но может вести себя по-разному.
поскольку ISNULL-это функция, она вычисляется только один раз. Как описанные выше входные значения для выражения COALESCE могут быть оценено несколько раз.
определение типа данных результирующего выражения отличается. ISNULL использует тип данных первого параметра, КОАЛЕСЦИРУЕТ следующим образом выражение CASE управляет и возвращает тип данных значения с помощью более высокий приоритет.
поддерживает ли это выражение, результат индивидуален для функции 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 );
проверки для ISNULL и COALESCE также различны. Например, значение NULL для ISNULL преобразуется в int, тогда как для COALESCE, необходимо указать тип данных.
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,
использовать
COALESCE, которая возвращает первое не-null значение, напримерSELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeededбудет установлен успешно как 0, если он возвращается как
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