2016-07-31 37 views
2

,它基本上都值了數進行比較,並返回其OutputValue。mysql的where子句不工作我有mysql的where子句中,我有一個表,有3個字段,OutputValue,FromValue和ToValue麻煩的所有值

這是我的表的SQL

CREATE TABLE IF NOT EXISTS `value_scale` (
    `OutputValue` varchar(50) NOT NULL, 
    `FromValue` float NOT NULL, 
    `ToValue` float NOT NULL, 
    PRIMARY KEY (`OutputValue`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `value_scale` (`OutputValue`, `FromValue`, `ToValue`) VALUES 
('L', 0.11, 0.3), 
('L1', 0.31, 0.5), 
('L2', 0.51, 0.7), 
('L3', 0.71, 1.99), 
('L4', 2, 2.99), 
('L5', 3, 9999), 
('P', -0.3, -0.11), 
('P1', -0.5, -0.31), 
('P2', -0.7, -0.51), 
('P3', -1.99, -0.71), 
('P4', -2.99, -2), 
('P5', -9999, -3), 
('S', -0.1, 0.1); 

在目標值不等於在FromValue或ToValue值,它顯示的結果,否則沒有輸出顯示

我的查詢是

SELECT * from value_scale where -0.31 between FromValue and ToValue 

它適用於-0.32和-0.3,但不適用於-0.31

即使我搜索在ToValue列值,不輸出顯示,forexample有一排(P1,-0.5,-0.31)

SELECT * FROM value_scale WHERE tovalue = -0.31 

甚至這個查詢顯示0行

回答

3

這是號碼問題的表示。浮點數爲,大約爲。這意味着你所看到的並不是你所得到的。所以,-0.31真的可以是-0.309999999997或類似的東西。

最好的解決方法是修復表。你似乎想保留兩位小數,所以使用decimal的數據類型:

CREATE TABLE IF NOT EXISTS `value_scale` (
    `OutputValue` varchar(50) NOT NULL, 
    `FromValue` decimal(10, 2) NOT NULL, 
    `ToValue` decimal(10, 2) NOT NULL, 
    PRIMARY KEY (`OutputValue`) 
) ; 

如果你已經有表,你可以改變它在的地方:

alter table value_scale alter column FromValue decimal(10, 2); 
alter table value_scale alter column ToValue decimal(10, 2); 

我還要提到的,那你應該有這樣的界限:

0.10 - 0.30 
0.30 - 0.50 

等等。然後,請勿使用between。使用:

where $val >= FromValue and $val < ToValue 

這可以防止0.305等問題不匹配行。

+0

轉換爲十進制'(10,2)'並在此[sqlfiddle](http://sqlfiddle.com/#!9/091dd/1)解決此問題。 – FrankerZ

+1

偉大:)感謝您的幫助,現在我知道原因,並選擇正確的數據類型使用的重要性,謝謝。將接受答案在5分鐘內 –

+0

好的,謝謝你的提示,我查了一下,也沒有顯示任何行(如你所說),但我總是有2位小數值與這些值進行比較 –