Mysql用in子句比较浮点数



表中有float类型的列

我有一个查询,它接受一个值或一个值数组来与其中一列进行比较,并返回包含该值或存在于值数组中的所有行。

当比较一个值时,我使用LIKE子句,因为mysql中的浮点数不能使用等号进行比较。

但是,当与值数组进行比较时,我使用IN子句,这对我不起作用。

如何使用IN子句比较浮点数?

比较float数据的问题不是"不能使用等号进行比较"。问题是所有浮点值都是近似值,而=运算符不做近似值,只做精确的相等。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))

最新更新