Zastąpienie wartości NULL wartością 0 w zapytaniu serwera SQL


175

Opracowałem zapytanie i otrzymałem wyniki dla pierwszych trzech kolumn NULL. Jak mogę to zastąpić 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 Pierwsze trzy kolumny: sum (przypadek, gdy c.runstatus = 'Succeeded', a następnie 1 end) as Succeeded, sum (case when c.runstatus = 'Failed' then 1 end) as Failed, sum (case when c.runstatus = „Anulowane”, a następnie 1 koniec) jako Anulowane
Bhaskar Mishra

Sparky, Oracle jest inny, nie jest konieczne, aby używać NVL lub NVL2 ... sprawdź oracle-base.com/articles/misc/null-related-functions
KingRider

Odpowiedzi:


376

Jeśli chcesz zamienić prawdopodobnie nullkolumnę na coś innego, użyj IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Spowoduje to umieszczenie 0 w myColumn, jeśli jest null w pierwszej kolejności.


2
Dla tych nielicznych używających SQL Server 2000 lub 2005 ISNULL to SQL Server 2008 i nowsze.
Kyle

1
dla wielu kolumn muszę wielokrotnie pisać ISNULL, czy jest coś takiego jak ISNULL (myColumns, 0)?
Flaudre

@Kyle: To jest niepoprawne: z własnego doświadczenia (i cytatu z książki ) mogę potwierdzić, że ISNULL jest obsługiwany od (przynajmniej) SQL Server 2000, prawdopodobnie nawet wcześniej.
Heinzi

@Flaudre: Musisz wielokrotnie napisać ISNULL, ponieważ każda kolumna wyjściowa musi mieć własne wyrażenie.
Heinzi

To pomoże mi także, aby uzyskać dokładny wynik w SQL Server 2016 Dzięki dużo, po prostu made my day @phadaphunk
PatsonLeaner

83

Możesz użyć obu tych metod, ale istnieją różnice:

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

Porównanie COALESCE () i ISNULL ():

  1. Funkcja ISNULL i wyrażenie COALESCE mają podobny cel, ale mogą zachowywać się inaczej.

  2. Ponieważ ISNULL jest funkcją, jest oceniana tylko raz. Jak opisano powyżej, wartości wejściowe dla wyrażenia COALESCE można oceniać wielokrotnie.

  3. Określenie typu danych w wynikowym wyrażeniu jest inne. ISNULL używa typu danych pierwszego parametru, COALESCE postępuje zgodnie z regułami wyrażeń CASE i zwraca typ danych o najwyższym priorytecie.

  4. NULLability wyrażenia wyniku jest różne dla ISNULL i COALESCE. Zwracana wartość ISNULL jest zawsze uznawana za NIE NULL (zakładając, że wartość zwracana jest wartością niezerową), podczas gdy COALESCE z parametrami niezerowymi jest uważana za NULL. Zatem wyrażenia ISNULL (NULL, 1) i COALESCE (NULL, 1), chociaż równoważne, mają różne wartości null. Ma to znaczenie, jeśli używasz tych wyrażeń w kolumnach obliczanych, tworzysz kluczowe ograniczenia lub określasz wartość zwracaną skalarnej deterministycznej funkcji UDF, aby można ją było indeksować, jak pokazano w poniższym przykładzie.

- Ta instrukcja kończy się niepowodzeniem, ponieważ KLUCZ PODSTAWOWY nie może zaakceptować wartości NULL - a wartość null wyrażenia COALESCE dla kolumny2 - jest obliczana na NULL.

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

- Ta instrukcja kończy się powodzeniem, ponieważ wartość null funkcji - ISNULL jest obliczana jako NIE NULL.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. Walidacje dla ISNULL i COALESCE są również różne. Na przykład wartość NULL dla ISNULL jest konwertowana na int, podczas gdy dla COALESCE należy podać typ danych.

  2. ISNULL przyjmuje tylko 2 parametry, podczas gdy COALESCE przyjmuje zmienną liczbę parametrów.

    jeśli chcesz dowiedzieć się więcej, tutaj znajduje się pełny dokument z msdn.


23

Z coalesce:

coalesce(column_name,0)

Chociaż w przypadku sumowania when condition then 1równie łatwo można zmienić sumna count- np:

count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,

( Count(null)zwraca 0, a sum(null)zwraca null.)


10

Kiedy mówisz o pierwszych trzech kolumnach, masz na myśli swoje SUMkolumny? Jeśli tak, dodaj ELSE 0do swoich CASEoświadczeń. SUMZ NULLwartości jest 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

Owiń kolumnę w tym kodzie.

 ISNULL(Yourcolumn, 0)

Może sprawdź, dlaczego otrzymujesz wartości zerowe


6

Use COALESCE, która zwraca pierwszą wartość niezerową, np

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

Nastąpi powodzenie jako 0, jeśli zostanie zwrócony jako NULL.


1

Dodaj else do instrukcji case, aby domyślnie miały wartość zero, jeśli warunek testowy nie zostanie znaleziony. W tej chwili, jeśli warunek testowy nie zostanie znaleziony, NULL jest przekazywany do funkcji 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

Jeśli używasz Presto, AWS Athena itp., Nie ma funkcji ISNULL (). Zamiast tego użyj:

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, 

Problem polega na tym, że bez instrukcji else jest zobowiązany do otrzymania wartości Null, gdy stan uruchomienia nie jest określony w opisie kolumny. Dodanie czegokolwiek do wartości Null spowoduje wyświetlenie wartości Null i to jest problem z tym zapytaniem.

Powodzenia!


0

postępując zgodnie z poprzednimi odpowiedziami traciłem nazwę kolumny w bazie danych serwera SQL, jednak stosowanie się do tej składni pomogło mi również zachować nazwę kolumny

ISNULL(MyColumnName, 0) MyColumnName
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.