2009-08-19 19 views
21

Ich versuche, eine SELECT Spiel auf einem Tisch auf einer Kennung und einem Preis basiert zu tun, wie zum Beispiel:Auswählen eines Schwimmers in MySQL

SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31'; 

Die oben genannten Erträge Reihen Null, während, wenn Sie das price='101.31' Bit entfernen es gibt die richtige Zeile zurück.

Doing a ...

SELECT * FROM `table`; 

Gibt die gleiche Zeile wie oben und ganz eindeutig fest, dass price='101.31'. Doch select kann nicht übereinstimmen. Ändern = zu <= macht es funktioniert - aber das ist nicht gerade eine Lösung.

Gibt es eine Möglichkeit, den MySQL-Float auf 2 Stellen zu transformieren, bevor die Operation ausgeführt wird, so dass das obige SELECT funktioniert (oder eine andere Lösung)?

Danke!

Antwort

35

in eine Dezimalzahl Casting für mich gearbeitet:

SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL); 

Sie können jedoch nur die Herstellung der price Spalte DECIMAL in erster Linie zu betrachten. DECIMAL wird allgemein als der beste Typ für den Umgang mit monetären Werten angesehen.

+4

Hinweis: Verwenden Sie 'DECIMAL (M, D)'. 'CAST (101.31 AS DECIMAL) = 101' –

-1

Vielleicht etwas in diese Richtung:

SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01; 
11

Es funktioniert nicht, weil ein Schwimmer von Natur aus ungenau ist. Der tatsächliche Wert ist wahrscheinlich etwas wie "101.3100000000001". Sie könnten ROUND() zuerst verwenden, um es auf 2 Stellen zu runden, oder besser noch einen DECIMAL-Typ anstelle eines Floats zu verwenden.

8

Verwenden Sie niemals Schwimmer für Geld.

+6

Woher bekomme ich eine Änderung für den Kunden? (Sorry, ein bisschen Ladenbesitzer Humor :) – Meep3D

-1

Funktioniert das?

SELECT * , ROUND(price, 2) rounded 
FROM table 
WHERE ident = 'ident23' 
HAVING rounded = 101.31 
6

Heute kam ich auch in der gleichen Situation und nur Funktion von MySQL unter Verwendung von FORMAT gelöst bekommen, es werden die Ergebnisse angezeigt, die genau Ihre WHERE-Klausel entsprechen.

SELECT * FROM yourtable WHERE FORMAT(col,2) = FORMAT(value,2) 

Erläuterung: FORMAT('col name', precision of floating point number)

0

Ich wurde Lösung gesucht, aber schließlich habe ich es meinem früheren PHP-number_format() verwendet, die @ hmasif-Lösung zu sehen kam.

verwenden und Sie werden Ihre Schwimmer bekommen - mysql Spiel:

$floatmatch = number_format((float)$yourfloatvariable,5); 

wo 5 fünf Saiten aus Komma ist. z.B. 7.93643