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
Bhaskar Mishra
źródło
@ 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.

phadaphunk
źródło
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.

Mojtaba Rezaeian
źródło
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.)


źródło
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, 
sgeddes
źródło
8

Prosty sposób to

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL
Umang Patwa
źródło
7

Owiń kolumnę w tym kodzie.

 ISNULL(Yourcolumn, 0)

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

Konstabl
źródło
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.

dKen
źródło
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
Zły wilk
źródło
1

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

SELECT COALESCE(myColumn, 0 ) FROM myTable
Gaz_Edge
źródło
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!

Krishna Chavali
źródło
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
Kameleon
źródło