我在表中有浮点类型的列。
我有一个查询,它接受一个值或一组值来与其中一列进行比较,并返回包含该值或存在于值数组中的所有行。
比较一个值时,我使用 LIKE 子句,因为 mysql 中的浮点数不能使用等号进行比较。
但是,当与值数组进行比较时,我使用了 IN 子句,这对我不起作用。
如何使用 IN 子句比较浮点数?
我在表中有浮点类型的列。
我有一个查询,它接受一个值或一组值来与其中一列进行比较,并返回包含该值或存在于值数组中的所有行。
比较一个值时,我使用 LIKE 子句,因为 mysql 中的浮点数不能使用等号进行比较。
但是,当与值数组进行比较时,我使用了 IN 子句,这对我不起作用。
如何使用 IN 子句比较浮点数?
您比较浮点数据的问题不是“无法使用等号比较”之一。问题是所有浮点值都是近似值,= 运算符不做近似值,只有精确相等。IN 运算符也是如此。
大多数处理浮点比较的人使用这样的东西:
value BETWEEN target-epsilon AND target+epsilon
其中 epsilon 类似于 0.0001。
因此,做
value IN (target1, target2, target3)
很难可靠地工作。你没有提到你在你的浮点值中存储了什么样的数字。但是,让我们假设它们是纬度值,看起来像这样:42.79842367778193。现在,显然 42.7984237 足够接近,可以在这里被认为是相等的。
所以你可以做这种事情。
CAST(10000.0 * latitude AS INT) IN
(CAST(10000.0 * 42.7984237 AS INT), CAST(10000.0 * 43.1234567 AS INT))