Warum ist die Ausgabe von select nullif (0, '') NULL (0 wird erwartet)?

8

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?

    
user2616821 01.11.2013, 23:33
quelle

2 Antworten

11

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.

    
Corbin 01.11.2013, 23:51
quelle
1

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.

    
Sir Crispalot 01.11.2013 23:47
quelle

Tags und Links