Ответ 1
Если вы хотите заменить столбец возможно null
чем-то другим, используйте IsNull.
SELECT ISNULL(myColumn, 0 ) FROM myTable
Это положит 0 в myColumn, если вначале это значение равно null.
Я разработал запрос, а в результатах для первых трех столбцов я получаю 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
Если вы хотите заменить столбец возможно null
чем-то другим, используйте IsNull.
SELECT ISNULL(myColumn, 0 ) FROM myTable
Это положит 0 в myColumn, если вначале это значение равно null.
Вы можете использовать оба этих метода, но есть различия:
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
);
Валидации для 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,
Вставьте этот столбец в этот код.
ISNULL(Yourcolumn, 0)
Возможно, проверьте, почему вы получаете нули
Используйте COALESCE
, который возвращает первое непустое значение, например.
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
Простой способ
UPDATE tbl_name SET fild_name = value WHERE fild_name IS 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,
проблема заключается в том, что без инструкции else вы обязаны получать Null, если статус прогона не является указанным статусом в описании столбца. Добавление чего-либо к Null приведет к Null, и это проблема с этим запросом.
Удачи!