Fall, bei null zu false ausgewertet wird
Heute war ich überrascht von dieser case
Verhalten:
select case when null then true else false end;
case
------
f
Ich würde erwarten, dass es zurück null
da ein null
gegossen boolean yelds eine null
kein false
:
select null::boolean is null;
?column?
----------
t
Kommentare über die Gründe für dieses Verhalten? Was Bin ich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denken Sie an die
CASE
Ausdruck, wie es war unter dernull
als Eingabe für eine Funktion oder ein operator, wo die null-Eingabe führt in der Regel zu null Ausgabe:während in der Tat verhält es sich wie ein
WHERE
- Klausel in Bezug auf die Behandlung von null:In
WHERE
Klauseln - und inCASE
eineNULL
Ergebnis von einem test-Ausdruck behandelt, als "nicht wahr und daher falsch". In gewisser Weise ist es bedauerlich, dass der SQL-standard nichtNULL
Ergebnis in einemWHERE
Ausdruck ein Fehler, anstatt behandeln Sie es als falsch, aber das ist, wie es ist.Dies ist noch eine weitere schmerzhafte symptom von
NULL
's gespaltene Persönlichkeit, wo die SQL-spec, kann nicht entscheiden, obNULL
bedeutet "unbekannte/Undefinierte Wert" oder "die Abwesenheit eines Werts", ähnlich wie das schreckliche Durcheinander mitNULL
s und Aggregate.CASE
ist keine Funktion, es ist ein besonderer Ausdruck mit eigenen Regeln. Funktionen können Besondere Behandlung von null sowieso; Zeuge Oracledecode
. PostgreSQL kann nicht dieses Problem beheben, ohne das umschreiben der SQL-Spezifikation zu beheben, die Verwirrung über die null-Werte völlig, in den Prozess, so dass es völlig unvereinbar mit allem, was sonst noch.Etwas wie
Falls Sie (auch) brauchen so etwas wie
Verwenden:
In Fall müssen Sie noch eine case-Anweisung verwenden Sie dann:
Können Sie 'wählen' um zu überprüfen, DATEN-Spalte, die für null:
Den
CASE
Aussage, die Sie schrieb, hat zwei Zweige:Derjenige,
when null then true
wird nie passieren (weilnull
ist nicht gleichtrue
)Sowie
else
Zweig, das wird passieren, wenn es keine Spiele in der regulärenwhen
Zweige.Beispiel:
val
null ist kann man nicht sagen, ob es ist oder es ist nicht ein Spiel, danull = 1
Ergebnisse null nicht falsch noch wahr.TRUE
. Wenn kein Zweig istTRUE
,ELSE
gewinnt, die standardmäßig aufNULL
wenn Sie fehlt. Das ist die ganze Geschichte.Als PostgreSQL-Dokumentation Staaten:
Postgresql nicht gegossen, den output, und da haben Sie ein
else
Zustand, Sie bekommenfalse
. Die nächste Abfrage gibt einen null-Wert (Da es keineelse
Zustand)null
Sie können nicht sagen, dass es nicht wahr ist. Sie weiß es nicht. Es könnte sein, eine von true oder false.