SQLite entspricht ISNULL (), NVL (), IFNULL () oder COALESCE ()

92

Ich möchte vermeiden, dass mein Code viele Überprüfungen wie die folgenden enthält:

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

Ich dachte, ich könnte meine Abfrage einfach dazu bringen, sich um die Nullen zu kümmern, indem ich so etwas mache:

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

Ich verwende jedoch SQLite und es scheint die isnullFunktion nicht zu erkennen . Ich habe auch einige gleichwertige ausprobiert, die in anderen Datenbanken erkannt wurden ( NVL(),IFNULL() und COALESCE()), aber SQLite scheint nicht von ihnen zu erkennen.

Hat jemand irgendwelche Vorschläge oder kennt einen besseren Weg, dies zu tun. Leider hat die Datenbank nicht für alle Felder Standardwerte. Außerdem muss ich LEFT JOINin einigen Fällen einige Klauseln verwenden, in denen einige der zurückgegebenen Felder null sind, da der übereinstimmende Datensatz in der LEFT JOINTabelle nicht vorhanden ist.

Jason Down
quelle

Antworten:

130

IFNULL, siehe hier: http://www.sqlite.org/lang_corefunc.html#ifnull

Keine Klammern um die Funktion

SQLMenace
quelle
Bah, es waren die eckigen Klammern. Dank dafür. Hat mich verrückt gemacht, dass die Dokumentation besagt, dass sie unterstützt wird (hat auch eine Verschmelzung), aber es hat nicht funktioniert. Einer dieser Tage ...
Jason Down
1
Mir ist klar, dass Ihre Beschreibung von "Keine Klammern um die Funktion" auf die Frage verweist, aber mit einer solchen Aussage wäre es hilfreich, ein Beispiel unter Ihrer ursprünglichen Aussage zu haben.
Palswim
40

Versuche dies

ifnull(X,Y)  

z.B

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

Die ifnull()Funktion gibt eine Kopie ihres ersten Nicht-NULL-Arguments zurück oder NULL, wenn beide Argumente NULL sind. Ifnull()muss genau 2 Argumente haben. Die ifnull()Funktion entspricht coalesce()zwei Argumenten.

Hardik Darji
quelle
1
Ja, ich habe herausgefunden, dass ifnullich es wollte ... Ich musste nur die eckigen Klammern fallen lassen, die ich benutzte.
Jason Down
@HardikDarji Weil einige glückliche Administratoren die Worte "try this" sahen und nicht weiter lasen. Oder weil jemand fälschlicherweise angenommen hat, dass Ihr Vergleich von ifnull () mit coalesce () fehlerhaft ist, wie dies in anderen Datenbankumgebungen der Fall wäre (jedoch nicht in SQLite). Auf jeden Fall, wen interessiert das? "Versuchen Sie dies" -Antworten sind besser als "Lesen Sie die Dokumentation" -Antworten. Ich werde nicht-Code mit Antworten überfliegen / sie nicht einmal lesen. Danke für die Antwort!
Maplemale
25

Wenn es keine ISNULL()Methode gibt, können Sie stattdessen diesen Ausdruck verwenden:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Dies funktioniert genauso wie ISNULL(fieldname, 0).

Mahdi Mohajer
quelle
1
Die Funktion ifnullist das SQLite-Äquivalent der isnullFunktion, nach der die Frage gestellt wurde. Wenn Sie dies jetzt lesen, lesen Sie bitte die Antwort von SQLMenace (von über anderthalb Jahren zuvor), bevor Sie Ihre eigene Lösung mit schreiben CASE.
spaaarky21
1
@ spaaarky21 - Du machst einen guten Punkt. Diese Antwort ist jedoch hilfreich für Benutzer, die möglicherweise SQLite nur für Komponententests und ein anderes RDBMS für Live-Code verwenden. In diesem Fall ist die Verwendung von CASEAnweisungen möglicherweise sinnvoller als IFNULL.
Seth Flowers
2
@sethflowers Ich kann den Wert sehen, wenn Null-Standardwerte RDBMS-neutraler implementiert werden, aber das ist die Antwort auf eine andere Frage. :) Das OP fragt einfach nach SQLites Äquivalent zu isnullanderen Systemen und ich möchte die Leute nicht dazu ermutigen, "ihre eigenen zu rollen".
spaaarky21
Ich habe nur nach etwas wie einem ifnotnull () oder einem ifnonnull () gesucht, um ifnull () zu ergänzen, um es bei der Verkettung von Zeichenfolgen innerhalb der SELECT-Klausel zu verwenden, um "last_name, first_name" anzuzeigen, aber das Komma nur zu verketten, wenn first_name nicht null ist. Dieser Ansatz ließ mich das tun.
Steve_0804
3

Verwenden Sie IS NULLoder IS NOT NULLin der WHERE-Klausel anstelle der ISNULL () -Methode:

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL
Thilo
quelle
Bitte bearbeiten Sie mit weiteren Informationen. Nur-Code- und "Versuch dies" -Antworten werden nicht empfohlen, da sie keinen durchsuchbaren Inhalt enthalten und nicht erklären, warum jemand "dies versuchen" sollte.
Abarisone
1
Das ist nicht relevant für das, was gefragt wurde. Das OP möchte keine Zeilen herausfiltern, myField1die einen Wert ungleich Null haben. Er möchte den Wert in der Ergebnisspalte durch einen anderen ersetzen, wenn der Zeilenwert Null ist.
Daniel Kamil Kozar
2

Verwenden Sie für das Äquivalent von NVL () und ISNULL ():

IFNULL(column, altValue)

column : Die Spalte, die Sie auswerten.

altValue : Der Wert, den Sie zurückgeben möchten, wenn 'column' null ist.

Beispiel:

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

* Hinweis: Die Funktion COALESCE () funktioniert genauso wie für andere Datenbanken.

Quellen:

lewdev
quelle
-4

Sie können eine solche Funktion einfach definieren und dann verwenden:

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

oder dieselbe minimierte Version:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}
Stas Prihod'co
quelle
4
Das ist nicht SQLite.
Daniel Kamil Kozar