2017-01-28 46 views
0

我想比較兩個字符串作爲MySQL中的數字。我有以下數據在我的表:如何將兩個數字作爲字符串在MySQL中進行比較?

0,15 kg 0,52 kg 0,68 kg 1,24 kg

現在我想比較與數據的字符串。我試過是這樣的:

SELECT * FROM `foobar` WHERE weight+0.0 <= '0,7 kg' 

由於MySQL的似乎不明白逗號作爲小數點分隔我試圖用一個點替換它:

SELECT * FROM `foobar` WHERE REPLACE(weight+0.0,',','.') <= REPLACE('0,7 kg',',','.') 

不過我總是會有奇怪的結果,包括那些數字大於0.7。奇怪,當我嘗試訂購重量欄時,訂購是正確的!

+4

只要將數據妥善保存即可 – Strawberry

+0

當然,您應該將其分開,就像草莓提到的那樣。但是MySQL能夠對此進行排序。例如'where foo>'0,52''起作用。 – Alex2php

+0

是的,我知道它應該以不同的方式存儲。如果數字後面有「千克」,分類將無法正常工作。 – phpheini

回答

1

使用構建CAST(VAL爲十進制(10,2))

SELECT * FROM `foobar ` 
WHERE CAST(REPLACE(weight,',','.') AS DECIMAL(10,2)) <= CAST(REPLACE('0,7 kg',',','.') AS DECIMAL(10,2)); 

查詢進行了測試,並給出正確的結果。

此解決方案不能使用索引。更好的方法是對填充了計算數據的臨時表進行查詢。或者,您可以將索引DECIMAL列weight_dec添加到此表中,並使用觸發器根據權重填充數據。然後使用weight_dec進行查詢。

+0

很棒,謝謝!你知道這兩個操作是否會花費很多性能還是可以在生產中使用的? – phpheini

+1

我認爲這是一些成本,但你說你堅持這個分貝設計。不要忘記標記爲答案:) –

+1

@phpheini ** any **查詢列值被用作函數的參數或與WHERE子句中的操作錯誤(例如權重+0)一起在規模上引起嚴重的性能損失,因爲它強制表掃描以評估函數每行都阻止在任何RDBMS(不僅僅是MySQL)中使用任何索引。你不應該寫這樣的查詢。但是,如果您正在做類似的事情,那麼這個查詢不會比其他任何更糟。你需要修復你的設計。在此之前,這是正確的解決方案。 –