SQL server 'wie' gegen ein float-Feld produziert inkonsistente Ergebnisse
Ich bin mit LIKE
zurückkehren passenden numerischen Ergebnisse gegen ein float-Feld. Es scheint, dass, wenn es sind mehr als 4 stellen Links von der Dezimalstelle, Werte, die mit meinem Suchbegriff auf der rechten Seite der Dezimalstelle sind nicht zurückgekehrt. Hier ist ein Beispiel zur Veranschaulichung der situation:
CREATE TABLE number_like_test (
num [FLOAT] NULL
)
INSERT INTO number_like_test (num) VALUES (1234.56)
INSERT INTO number_like_test (num) VALUES (3457.68)
INSERT INTO number_like_test (num) VALUES (13457.68)
INSERT INTO number_like_test (num) VALUES (1234.76)
INSERT INTO number_like_test (num) VALUES (23456.78)
SELECT num FROM number_like_test
WHERE num LIKE '%68%'
Dass die Abfrage nicht zurück, wird der Datensatz mit dem Wert von 12357.68, aber es tut Rückkehr der Datensatz mit dem Wert von 3457.68. Auch die Ausführung der Abfrage mit 78 statt 68 nicht zurück 23456.78 aufnehmen, aber mit 76 gibt die 1234.76 aufnehmen.
So, die Frage: warum die eine größere Zahl bewirkt, dass diese Ergebnisse zu ändern? Wie kann ich meine Abfrage die erwarteten Ergebnisse erhalten?
- verwenden Sie nicht
LIKE
gegen zahlen. Es ist ein string-Vergleich für strings verwendet. - was ist, wenn die numerischen Werte sind cast strings?
- Sie könnte das tun, aber ich Schätze, der Grund, warum auf der Erde Sie?
- Ich muss einige Benutzer Suche Artikel gegen numerische Felder, auf denen die Ergebnisse, die Sie wollen, mit 'wie'. Was ist die alternative?
- Wie ist nicht das problem hier. Es kann funktionieren mit zahlen, implizite Konvertierung in string auftreten. Float ist das problem, es ist annähernd Datentyp - Schalter sollte man dezimal oder zumindest wirken zu dezimal, bevor Sie den Vergleich.
- sqlfiddle.com/#!6/d41d8/4730
- ja, du hast Recht. Die Antwort hier(stackoverflow.com/questions/15950705/...), scheint für mich arbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
like
Betreiber erfordert eine Zeichenfolge als left-hand-Wert. Laut der Dokumentation, die eine Konvertierung vonfloat
zuvarchar
können mehrere Stile:Den Standard-Stil funktioniert gut für die sechs Ziffern in
3457.68
, aber nicht für die sieben Ziffern in13457.68
. 16-stellig statt 6, Sie könnte verwendenconvert
angeben und Stil 2. Stil 2 stellt eine Zahl dar wie3.457680000000000e+003
. Aber das würde nicht funktionieren, für die ersten zwei Ziffern, und Sie erhalten eine unerwartete+003
Exponenten für frei.Der beste Ansatz ist wahrscheinlich eine Umwandlung von
float
zudecimal
. Konvertierung können Sie angeben, das Ausmaß und Präzision. Mit Skala 20 und Präzision 10, der Schwimmer wird dargestellt als3457.6800000000
:decimal
zuvarchar
nicht drop Ziffern.Wenn Sie vergleichen die Anzahl mit WIE es implizit in eine Zeichenfolge konvertiert und dann abgestimmt
Das problem hier ist, dass float-Zahl ist nicht genau und wenn es umgewandelt wird, können Sie bekommen
13457.679999999999999 statt 13457.68
So begeisterter dies ausdrücklich format Zahl im entsprechenden format(nicht sicher, wie dies in sql server, aber es wird so etwas wie)
Konvertierung zum string rundet Ihre Werte. Beide
CONVERT
undCAST
haben das gleiche Verhalten.Oder
Ergebnisse:
Müssen Sie die
STR
Funktion und korrekte Parameter-format, um zu versuchen, um Ihre Ergebnisse. Zum Beispiel,gibt:
Ziemlich gut gelöst, aber man braucht sich nur den CAST einmal, nicht zweimal wie die anderen Antwort erläutert, WIE kümmert sich um die string-Konvertierung:
Und hier ist ein SQL Fiddle zeigt das rundungsverhalten: SQL Fiddle
Es ist wahrscheinlich, weil ein FLOAT-Datentyp stellt eine floating-point-Zahl das ist eine Annäherung der Anzahl und sollten nicht herangezogen werden, für genaue Vergleiche.
Wenn Sie brauchen, um eine Suche beinhaltet, dass der float-Wert müssten Sie entweder speichern Sie es in einen decimal-Datentyp (was hält die genaue Zahl) oder konvertieren Sie es in ein varchar mit so etwas wie die STR () - Funktion