Warum ist die Ausgabe von select nullif(0,'')
NULL? (0 wird erwartet).
Wie kommt es, dass 0 gleich '' ist?
Wenn ich select nullif (convert (varchar, 0), '') verwende, wird die erwartete 0 zurückgegeben.
NULLIF
offizielle Seite sagt, die Funktion vergleicht zwei skalare Ausdrücke. Ist 0 nicht skalar? Bitte sagen Sie mir, was fehlt mir in meinem Verständnis?
Ganzzahlen stehen in der Priorität des Datentyps weiter oben, sodass der varchar in einen konvertiert wird int. Eine leere Zeichenfolge, die in ein int umgewandelt wird, ist 0
, und von dort ist es ziemlich offensichtlich ( 0 == 0
).
0 == 0
, also NULLIF(0, 0) => NULL
(seit NULLIF(a, b)
gibt NULL
iff a == b
zurück)
Wenn du nullif(convert(varchar,0),'')
machst, machst du nur NULLIF('0', '')
. Offensichtlich ist eine Zeichenfolge, die nur 0 und eine leere Zeichenfolge enthält, nicht gleich, daher erhalten Sie 0
.
Eine eingehendere Erklärung ist, dass zwei verschiedene Typen nicht wirklich verglichen werden können. Sie können eine Zeichenfolge nicht mit einer Ganzzahl oder einer Zeichenfolge und einem Gleitkommawert oder einer Ganzzahl und einem Gleitkommawert vergleichen. Das bedeutet, dass für Vergleiche verschiedener Typen eine implizite Casting-Regel gelten muss. In diesem Fall passiert es einfach, dass wenn Sie einen String (naja, technisch ein varchar) und ein int vergleichen, der varchar implizit in einen int konvertiert wird. Dies ist viel einfacher zu sehen, wenn Sie Folgendes beachten:
%Vor%Wie Sie sehen werden, ergibt die Umwandlung eine Ganzzahl mit dem Wert 0. Darüber hinaus führt dies zu einem Vergleich zwischen den beiden Werten, die als wahr gelten.
Ist es möglich, dass die Funktion nullif
beide Werte entweder in bit
oder in int
eingibt, wie vom ersten Wert impliziert?
Wenn dies der Fall ist, würden beide einen Wert von 0 annehmen, daher würde nullif
null
zurückgeben, wie Sie sehen.
Dies würde erklären, warum die Konvertierung in varchar
das Problem löst.
Tags und Links sql-server tsql