SQLite odpowiednik ISNULL (), NVL (), IFNULL () lub COALESCE ()


92

Chciałbym uniknąć wielu sprawdzeń, takich jak następujący w moim kodzie:

myObj.someStringField = rdr.IsDBNull(someOrdinal) 
                            ? string.Empty 
                            : rdr.GetString(someOrdinal);

Pomyślałem, że mogę po prostu poprosić o zajęcie się wartościami zerowymi, robiąc coś takiego:

SELECT myField1, [isnull](myField1, '') 
FROM myTable1
WHERE myField1 = someCondition

Jednak używam SQLite i wydaje się, że nie rozpoznaje isnullfunkcji. Próbowałem zostały również niektóre równoważne te ujmuje się w innych bazach danych ( NVL(), IFNULL()i COALESCE()), ale SQLite nie wydają się rozpoznać żadnego z nich.

Czy ktoś ma jakieś sugestie lub zna lepszy sposób na zrobienie tego. Niestety baza danych nie ma wartości domyślnych dla wszystkich pól. Ponadto muszę użyć niektórych LEFT JOINklauzul w niektórych przypadkach, w których niektóre zwrócone pola będą miały wartość null, ponieważ pasujący rekord w LEFT JOINtabeli nie będzie istniał.

Odpowiedzi:


130

IFNULL, zobacz tutaj: http://www.sqlite.org/lang_corefunc.html#ifnull

brak nawiasów wokół funkcji


Bah to były nawiasy kwadratowe. Dziękuję za to. Doprowadzało mnie do szału, że w dokumentacji była napisana, że ​​jest obsługiwana (ma tam również koalescencję), ale nie działała. Jeden z tych dni ...
Jason Down

1
Zdaję sobie sprawę, że twój opis „brak nawiasów wokół funkcji” odnosi się do pytania, ale w przypadku takiego stwierdzenia pomocne byłoby umieszczenie przykładu pod początkowym stwierdzeniem.
palswim

40

Spróbuj tego

ifnull(X,Y)  

na przykład

select ifnull(InfoDetail,'') InfoDetail; -- this will replace null with ''
select ifnull(NULL,'THIS IS NULL');-- More clearly....

Plik ifnull()Zwraca kopię swojego pierwszego argumentu non-NULL lub null, jeśli oba argumenty są NULL. Ifnull()musi mieć dokładnie 2 argumenty. ifnull()Funkcja jest równoważna coalesce()z dwoma argumentami.


1
Tak, doszedłem do wniosku, że to ifnullchciałem ... Po prostu musiałem upuścić nawiasy kwadratowe, których używałem.
Jason Down,

@HardikDarji Ponieważ jakiś zadowolony administrator, który nie zgadza się, zobaczył słowa „spróbuj tego” i nie czytał dalej. Lub, ponieważ ktoś błędnie założył, że twoje porównanie ifnull () do coalesce () jest błędne, tak jak w innych środowiskach db (ale nie w sqlite). W każdym razie kogo to obchodzi. Odpowiedzi typu „wypróbuj to” są lepsze niż odpowiedzi „przeczytaj dokumentację”. Za każdym razem przejrzę nie kod zawierający odpowiedzi / nawet ich nie przeczytam. Dziękuję za odpowiedź!
maplemale

25

Jeśli nie ma ISNULL()metody, możesz użyć tego wyrażenia:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Działa to tak samo jak ISNULL(fieldname, 0).


1
Funkcja ifnulljest odpowiednikiem SQLite isnullfunkcji, o którą pytano. Każdy, kto czyta to teraz, powinien zapoznać się z odpowiedzią SQLMenace (sprzed ponad półtora roku wcześniej) przed napisaniem własnego rozwiązania przy użyciu CASE.
spaaarky21

1
@ spaaarky21 - Masz rację. Jednak ta odpowiedź jest przydatna dla tych, którzy potencjalnie używają sqlite tylko do testowania jednostkowego i używają innego RDBMS do kodu na żywo. W takim przypadku użycie czegoś takiego jak CASEstwierdzenia może mieć więcej sensu niż IFNULL.
Seth Flowers

2
@sethflowers Widzę wartość we wdrażaniu wartości domyślnych zerowych w sposób bardziej neutralny dla RDBMS, ale to jest odpowiedź na inne pytanie. :) OP po prostu prosi o odpowiednik SQLite isnullw innych systemach i nie chciałbym zachęcać ludzi do „rozwijania własnych”.
spaaarky21

Po prostu szukałem czegoś takiego jak ifnotnull () lub ifnonnull (), aby uzupełnić ifnull (), do użycia w konkatenacji ciągów w klauzuli SELECT, aby wyświetlić „last_name, first_name”, ale tylko połączyć przecinek, jeśli first_name nie jest zerowe. Takie podejście pozwoliło mi to zrobić.
steve_0804

3

Użyj IS NULLlub IS NOT NULLw klauzuli WHERE zamiast metody ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

Edytuj, podając więcej informacji. Odpowiedzi zawierające tylko kod i „wypróbuj to” są odradzane, ponieważ nie zawierają treści, które można przeszukiwać, i nie wyjaśniają, dlaczego ktoś powinien „spróbować tego”.
abarisone

1
To nie dotyczy tego, o co pytano. OP nie chce odfiltrowywać wierszy, w których myField1ma wartość różną od null, chce zastąpić wartość w kolumnie wynikowej inną, jeśli wartość wiersza jest równa null.
Daniel Kamil Kozar

2

Dla odpowiednika NVL () i ISNULL () użyj:

IFNULL(column, altValue)

column : Kolumna, którą oceniasz.

altValue : Wartość, którą chcesz zwrócić, jeśli wartość „kolumna” ma wartość null.

Przykład:

SELECT IFNULL(middle_name, 'N/A') FROM person;

* Uwaga: Funkcja COALESCE () działa tak samo, jak w przypadku innych baz danych.

Źródła:


-4

Możesz łatwo zdefiniować taką funkcję i użyć jej:

ifnull <- function(x,y) {
  if(is.na(x)==TRUE) 
    return (y)
  else 
    return (x);
}

lub ta sama zminimalizowana wersja:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}

4
To nie jest SQLite.
Daniel Kamil Kozar
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.