Mysql where子句不适用于所有值

时间:2016-07-31 21:07:45

标签: mysql sql

我遇到了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行

1 个答案:

答案 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之类的问题与行匹配。