Заміна NULL на 0 у запиті на сервер SQL


175

Я розробив запит, і в результатах для перших трьох стовпців я отримую 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 = 'Успіх', то 1 кінець) як Успішно, сума (випадок, коли c.runstatus = 'Не вдалося', то 1 кінець) як Помилка, сума (випадок, коли c.runstatus = 'Скасовано', тоді 1 кінець) як Скасовано
Бхаскар Мішра

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

Відповіді:


376

Коли ви хочете замінити можливий nullстовпець чимось іншим, використовуйте IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Це поставить 0 в myColumn, якщо воно в першу чергу буде нульовим.


2
Для тих, хто використовує SQL Server 2000 або 2005 ISNULL - це SQL Server 2008 і вище.
Кайл

1
для кількох стовпців чи потрібно писати ISNULL кілька разів чи є щось на зразок ISNULL (myColumns, 0)?
Флод

@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. NULLability результату вираження різна для ISNULL та COALESCE. Значення повернення ISNULL завжди вважається НЕ нульовим (якщо припустити, що значення повернення є нульовим), тоді як COALESCE з ненульовими параметрами вважається NULL. Таким чином, вирази ISNULL (NULL, 1) та COALESCE (NULL, 1), хоча еквівалентні, мають різні значення зведеності. Це має значення, якщо ви використовуєте ці вирази в обчислених стовпцях, створюючи ключові обмеження або роблячи зворотне значення скалярного UDF детермінованого, щоб його можна було індексувати, як показано в наступному прикладі.

- Цей випадок не вдається, оскільки ПЕРВИЧНИЙ КЛЮЧ не може прийняти значення NULL - а зведеність виразу COALESCE для col2 - оцінюється на NULL.

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

- Це твердження є успішним, оскільки зведена нанівець функція - ISNULL оцінюється як НЕ НУЛЬНА.

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 приймає лише два параметри, тоді як 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

Буде встановлено Succeded як 0, якщо він повернеться як NULL.


1

Додайте інше до заяв справи, щоб вони за замовчуванням дорівнювали нулю, якщо умова тесту не знайдено. На даний момент, якщо умова тесту не знайдено, 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, 

Проблема тут полягає в тому, що без іншого оператора ви зобов'язані отримати Null, коли стан запуску не є зазначеним статусом в описі стовпця. Додавання чого-небудь до Null призведе до Null, і це проблема з цим запитом.

Щасти!


0

Дотримуючись попередніх відповідей, я втрачав своє ім'я стовпця на SQL сервері db, однак наступний синтаксис допоміг мені зберегти ім'я ColumnName

ISNULL(MyColumnName, 0) MyColumnName
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.