【问题标题】:BETWEEN not working properlyBETWEEN 无法正常工作
【发布时间】:2016-09-06 07:51:06
【问题描述】:

我的表格有以文本形式存储的纬度和经度值。对于 lat 和 long 值的记录:

+------+-------------------+--------------------+
| Name |        Lat        |        Long        |
+------+-------------------+--------------------+
| ABC  | 32.74943951828427 | -97.33141142455626 |
+------+-------------------+--------------------+

我的 SQL 查询如下:

SELECT * FROM Incident I WHERE
(I.Lat BETWEEN '32.740446302225' AND '32.758432734343') 
AND 
(I.Long BETWEEN '-97.342104340547' AND '-97.320718508566')
LIMIT 5

但这会导致返回 0 行。 "ABC" 记录确实存在于表中,但我不知道为什么它没有拉它。字符串不能作为浮点数比较吗?

【问题讨论】:

  • 更大的问题是您为什么要以这种方式使用纬度和经度值?通常,您需要计算从一点到ABC 或表中其他位置的距离。
  • 这可以通过 SQL 查询来完成吗?
  • 谷歌“Haversine MySQL”
  • 你应该使用polygon search
  • x BETWEEN a AND b 表示a <= x AND x <= b。但是'-97.342104340547' > '-97.320718508566'(因为字符串使用字典顺序进行比较)这会导致在空范围内搜索I.Lat。显然,它没有找到任何记录。

标签: mysql sql geocoding


【解决方案1】:

这是因为您将它们用作字符串。

BETWEEN 语法是 -> value BETWEEN small_val AND big_val ,但是由于您将它们用作字符串,因此 -97.34.. 比 -97.32 大,因此它不起作用。

试试:

(CAST(I.Lat as UNSIGNED) BETWEEN 32.740446302225 AND 32.758432734343) 
AND 
(CAST(I.Long as UNSIGNED) BETWEEN -97.342104340547 AND -97.320718508566)

在字符串类型的列中存储数值是错误的!我强烈建议您将其更改为数字类型,因为它应该是。

【讨论】:

  • 我将它们存储为字符串,Lat 和Long 列的数据类型是varchar
  • 为什么将数值数据存储为 varchar?
  • 这是一个遗留系统,在设计阶段就是这样创建的。所以在这个阶段可能无法更改表格列类型
  • @asprin 正如我所说,如果不是 - 投射它们。无论如何 - 我强烈建议您将它们存储为数字,因为它们就是这样。
  • 我删除了单引号,它似乎确实有效。我认为它会给出一个错误,因为I.Lat 返回一个字符串,但我们正在将它与一个数字进行比较
猜你喜欢
  • 2023-04-10
  • 2017-08-03
  • 2018-03-25
  • 2016-12-01
  • 2015-05-28
  • 1970-01-01
  • 2016-09-01
  • 2012-07-11
  • 2018-04-08
相关资源
最近更新 更多