我遇到了mysql where子句的问题,我有一个表,有3个字段,OutputValue,FromValue和ToValue,它基本上将这两个值与一个数字进行比较并返回其OutputValue。
这是我的表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列中搜索值,也没有显示输出,例如有一行(P1,-0.5,-0.31)
SELECT * FROM value_scale WHERE tovalue = -0.31
即使此查询显示0行
答案 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之类的问题与行匹配。