Warum ist 0 gleich einem leeren String?


23

Ich brauche Hilfe, um herauszufinden, warum die folgende T-SQLAnweisung zurückgibt 1(true):

SELECT IIF( 0 = '', 1, 0)

Ich vermute, jemand hat eine ANSIOption wie SET ANSI_NULLSoder etwas anderes geändert , das das Verhalten verursacht.

Mein Problem ist, dass ich einige Werte verbinde und in der letzten Zeilengruppe Werte habe, die durch 0und ''Werte verbunden sind, die nicht korrekt sind.

Antworten:


31

Das ist nur dokumentiertes Verhalten. Ich glaube nicht, dass irgendjemand die Einstellungen durcheinander gebracht hat.

Siehe Datentypvorrang in MSDN.

Wenn ein Operator zwei Ausdrücke verschiedener Datentypen kombiniert, geben die Regeln für die Vorrangstellung der Datentypen an, dass der Datentyp mit der niedrigeren Vorrangstellung in den Datentyp mit der höheren Vorrangstellung konvertiert wird.

Wie in den Kommentaren angegeben, wird die leere Zeichenfolge in einem beliebigen numerischen Typ in 0 und in 1900-01-01 00: 00: 00.000 konvertiert, wenn sie in ein Datum konvertiert wird.

EDIT: Ich denke, Ihr eigentliches Problem ist, dass Ihr Design so ist, dass Sie Felder eines anderen Datentyps zusammenfügen müssen. Die einzige Möglichkeit, dies zu umgehen, besteht darin, eine Konvertierung für Ihre Join-Klausel vorzunehmen, die die Abfrageleistung beeinträchtigt. Das Hauptproblem liegt wahrscheinlich beim Schemaentwurf

EDIT: Es gab eine Menge Diskussionen in den Kommentaren, die in den Chat verschoben wurden. So unlogisch es auch erscheinen mag, wenn Sie eine leere Zeichenfolge in einen anderen Datentyp konvertieren, erhalten Sie beliebige Werte.

Dieser Code:

SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')

Erzeugt diese Ausgabe:

0
0
1900-01-01
1900-01-01 00:00:00.000

Sie könnten dann erwarten, dass dieses Verhalten zwischen anderen vorhergehenden Datentypen konsistent ist, und erwarten, dass das Konvertieren von 0 in ein Datum denselben willkürlichen Wert erzeugt, dies jedoch nicht.

SELECT CONVERT(date, 0)

Produziert

Eine explizite Konvertierung von Datentyp int nach date ist nicht zulässig.

Weil es keine unterstützte Konvertierung ist

während

SELECT CONVERT(datetime, 0)

Kehrt zurück

01. Januar 1900 00:00:00

Also ja, es ist seltsam und willkürlich, aber tatsächlich dokumentiert und erklärbar.


Kommentare sind nicht für eine längere Diskussion gedacht. Die Konversation über diese Antwort wurde in den Chat verschoben .
Paul White sagt GoFundMonica

2
Ist das Verhalten CAST('' AS INT)-> 0 irgendwo dokumentiert? Es wäre schön, wenn Sie Verweis hinzufügen.
Salman A

2
@SalmanA: Es sollte im Abschnitt "Konvertieren von Zeichendaten " der char / varchar-Dokumentation dokumentiert werden , ist es aber derzeit nicht. Ich habe einen Kommentar hinterlassen und darum gebeten, dass er aufgenommen wird.
Heinzi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.