将 SQL 范围限定为国际日期变更线上的边界框
Posted
技术标签:
【中文标题】将 SQL 范围限定为国际日期变更线上的边界框【英文标题】:Scoping SQL to a bounding box over the international date line 【发布时间】:2021-12-30 05:28:12 【问题描述】:我正在尝试将查询范围限定为选择纬度/经度边界框内的位置。一般来说,如果边界框不跨越国际日期变更线,这可以正常工作。
SELECT *
FROM locations
WHERE latitude BETWEEN ? AND ?
AND longitude BETWEEN ? AND ?
但是 - 如果我的边界框要跨越国际日期变更线 - 比如说从 179.00
到 -179.00
的纵向边界,那么查询不会返回任何结果。我不能只是翻转订单并将其更改为 -179.00
和 179.00
之间,因为那样会返回我的边界框之外的东西。
什么是最好地确定所需的适当 SQL 的最明智的方法(作为有助于派生最佳 SQL 的 SQL 或伪代码)。
【问题讨论】:
您使用的是什么关系型数据库?您的位置是否以某种地理数据类型存储? +1 到 RDBMS 问题。一些数据库具有本机空间支持,您可以使用。例如。 BigQuery 有ST_IntersectsBox
,它可以在国际日期变更线上正常工作,例如ST_IntersectsBox(p, 179, -10, -179, 10)
.
我正在使用 mysql,但纬度/经度存储为单独的双列。
【参考方案1】:
您可以做的一件事是在WHERE
子句中使用CASE WHEN
表达式来区分您的纵向下限是否大于上限并相应地修改行为:
SELECT *
FROM locations
WHERE lon BETWEEN CASE WHEN @param1 > @param2 THEN -180.0
ELSE @param1
END AND @param2
OR lon BETWEEN CASE WHEN @param1 > @param2 THEN @param1
ELSE 181.0
END AND 180.0
对于您的示例(179.00
到 -179.00
的纵向边界),这将具有与
SELECT *
FROM locations
WHERE lon BETWEEN -180.0 AND -179.0
OR lon BETWEEN 179.0 AND 180.0
而倒置示例的相同查询(-179.00
到 179.00
的纵向边界)将评估为
SELECT *
FROM locations
WHERE lon BETWEEN -179.0 AND 179.0
OR lon BETWEEN 181.0 AND 180.0 -- (always false)
在this db<>fiddle (SQL Server example) 中查看它的实际效果。
【讨论】:
我喜欢它的发展方向——我认为这是一个很好的蓝图,可以将其转换为可以生成 SQL 而无需总是错误地 OR 子句的代码。以上是关于将 SQL 范围限定为国际日期变更线上的边界框的主要内容,如果未能解决你的问题,请参考以下文章
Mysql 数据查询语句中between and 是包含边界值的