gpt4 book ai didi

Mysql where 子句不适用于所有值

转载 作者:行者123 更新时间:2023-11-29 01:52:09 25 4
gpt4 key购买 nike

我在使用 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 行

最佳答案

这是数字问题的表示。 float 是近似值。这意味着所见即所得。所以,-0.31 实际上可能是 -0.309999999997 或类似的东西。

最好的解决办法是把 table 修好。您似乎需要两位小数,因此使用 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 不匹配行的问题。

关于Mysql where 子句不适用于所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38688399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com