MySQL查询将经度拉到一定范围内

时间:2015-08-23 19:54:07

标签: mysql geolocation geocoding

我的查询使用了一个简单的 WHERE logitude!=' 0' 我虽然足以只提取已成功进行地理编码的记录。

我无法控制质量或地址是否成功地进行了地理编码,因为该表是只读的。我只能控制我的查询。

经度通常写出最多6位小数:-81.729345

纬度和经度列的数据类型为十进制,长度为9,小数为6。

我想我需要确保我只选择一定经度范围内的记录?

我试过了这个:经度之间' -89.69%' AND' -72.07%' 有和没有%

但是它会返回所有记录,所以我知道它的错误,因为有些记录的地理编码不正确(例如:14.359164)。

如何仅在该范围内选择并允许任意数量的小数位?

以下是纬度/经度列的摘录:

=MID(IF(ISNUMBER(MATCH(C5, store1!$F$4:$F$29, 0)), "\store1", "")
    &IF(ISNUMBER(MATCH(C5, store2!$F$4:$F$29, 0)), "\store2", "")
    &IF(ISNUMBER(MATCH(C5, store3!$F$4:$F$29, 0)), "\store3", "")
    &IF(ISNUMBER(MATCH(C5, store4!$F$4:$F$29, 0)), "\store4", "")
    &IF(ISNUMBER(MATCH(C5, store5!$F$4:$F$29, 0)), "\store5", "")
    &IF(ISNUMBER(MATCH(C5, store6!$F$4:$F$29, 0)), "\store6", "")
    &IF(ISNUMBER(MATCH(C5, store7!$F$4:$F$29, 0)), "\store7", "")
    &IF(ISNUMBER(MATCH(C5, store8!$F$4:$F$29, 0)), "\store8", "")
    &IF(ISNUMBER(MATCH(C5, store9!$F$4:$F$29, 0)), "\store9", "")
    &IF(ISNUMBER(MATCH(C5, store10!$F$4:$F$29, 0)), "\store10", ""), 2, 99)

1 个答案:

答案 0 :(得分:1)

latitudelongitude列通常包含FLOATDOUBLE数据类型。他们很少有DECIMAL(10,4)数据类型,有时面对所有原因和逻辑,他们有VARCHAR(15)或某种类型的数据类型。

如果你的是FLOATDOUBLE,你的比较是通过算术完成的,而不是文本模式匹配。所以你想要这种WHERE子句。

WHERE Longitude BETWEEN -89.69 AND -72.07   

这将捕获-89.69,-72.07及其间的所有值。

这也适用于DECIMAL数据类型。如果您有varchar经度数据,最好的办法是将其更改为FLOAT。没错,你想要

 WHERE  CAST(longitude AS DECIMAL(10,4))  BETWEEN -89.69 AND -72.07

但这会有糟糕的表现。

%通配符仅适用于字符数据类型,仅适用于LIKE比较。