2009-08-19 18 views
21

próbuję zrobić SELECT spotkanie na stole w oparciu o identyfikator i cenie, takich jak:Wybór pływaka w MySQL

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

Powyższe zwraca zero wierszy, natomiast jeśli usuniesz price='101.31' bit zwraca właściwy wiersz.

Doing w ...

SELECT * FROM `table`; 

Zwraca sam wiersz jak wyżej i dość wyraźnie stwierdza, że ​​price='101.31'. Jednak wybór nie pasuje do tego. Zmiana = na <= powoduje, że działa - ale to nie jest dokładnie rozwiązanie.

Czy istnieje sposób na przeniesienie pływaka MySQL na 2 cyfry przed wykonaniem operacji na nim, co powoduje, że powyższe SELECT działa (lub inne rozwiązanie)?

Dzięki!

Odpowiedz

35

Casting do przecinku pracował dla mnie:

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

Jednak może warto rozważyć właśnie czyni kolumnie price ułamek dziesiętny w pierwszej kolejności. DECIMAL jest generalnie uważany za najlepszy typ do wykorzystania w odniesieniu do wartości pieniężnych.

+4

uwaga: użyj 'DECIMAL (M, D)'. 'CAST (101.31 AS DECIMAL) = 101' –

-1

Może coś wzdłuż tych linii:

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

To nie działa, ponieważ pływak jest z natury nieprecyzyjne. Wartość rzeczywista to prawdopodobnie coś w rodzaju "101.3100000000001" Można użyć na nim najpierw ROUND(), aby zaokrąglić go do 2 miejsc, lub lepiej użyć typu DECIMAL zamiast float.

8

Nigdy nie używaj pływaków dla pieniędzy.

+6

Skąd mogę pobrać zmiany dla klienta? (Przykro mi, trochę humoru sklepikarza :) – Meep3D

-1

Czy to działa?

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

Dziś przyszedł także po drugiej stronie tej samej sytuacji i zostanie rozwiązany tylko za pomocą funkcji formatowania MySQL, zwróci wyniki, które dokładnie pasują do Twojego klauzuli WHERE.

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

Objaśnienie: FORMAT('col name', precision of floating point number)

0

szukałem rozwiązania, ale w końcu zrobiłem to za pomocą mojego poprzedniego php Number_format(), która weszła w widząc @ rozwiązania hmasif za.

korzystać z tej i dostaniesz swoją float - mysql meczu:

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

gdzie 5 jest pięć strun z przecinkiem. na przykład 7.93643