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


176

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

@ user2246674 Первые три столбца: sum (случай, когда c.runstatus = 'Succeeded', затем 1 end) как Succeeded, sum (случай, когда c.runstatus = 'Failed', затем 1 end) как Failed, sum (случай, когда c.runstatus = 'Отменено', затем 1 конец) как Отменено
Бхаскар Мишра

Sparky, Oracle отличается не только тем, чтобы использовать NVL или NVL2 ... проверьте oracle-base.com/articles/misc/null-related-functions
KingRider

Ответы:


377

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

SELECT ISNULL(myColumn, 0 ) FROM myTable

Это поместит 0 в myColumn, если он нулевой во-первых.


2
Для тех немногих, кто использует SQL Server 2000 или 2005, ISNULL - это SQL Server 2008 и выше.
Кайл

1
для нескольких столбцов я должен написать ISNULL несколько раз или есть что-то вроде ISNULL (myColumns, 0)?
Flaudre

@Kyle: это неверно: из личного опыта (и цитаты из книги ) я могу подтвердить, что ISNULL поддерживается начиная с (по крайней мере) SQL Server 2000, возможно, даже раньше.
Хайнци

@Flaudre: Вы должны писать ISNULL несколько раз, поскольку каждый выходной столбец должен иметь свое собственное выражение.
Хайнци

Это также помогает мне получить точный результат в SQL Server 2016. Большое спасибо, вы только что сделали мой день @phadaphunk
PatsonLeaner

83

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

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

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

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

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

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

  4. Обнуляемость выражения результата различна для 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 оценивается как NOT 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.


23

С 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)возвращает ноль.)


10

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


7

Оберните вашу колонку в этот код.

 ISNULL(Yourcolumn, 0)

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


6

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

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

Устанавливает Succeeded как 0, если он возвращается как NULL.


1

Добавьте 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

1

Если вы используете Presto, AWS Athena и т. Д., Функция ISNULL () отсутствует. Вместо этого используйте:

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, 

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

Удачи!


0

следуя предыдущим ответам, я терял имя своего столбца в базе данных SQL-сервера, однако следование этому синтаксису помогло мне также сохранить ColumnName

ISNULL(MyColumnName, 0) MyColumnName
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.