将SQL范围界定为国际日期线上的边界框



我正在尝试确定查询范围,以选择纬度/经度边界框内的位置。一般来说,如果边界框不越过国际日期线,这很好。

SELECT *
FROM locations
WHERE latitude BETWEEN ? AND ?
AND longitude BETWEEN ? AND ?

但是,如果我的边界框要越过国际日期线,比如179.00-179.00的纵向边界,那么查询不会返回任何结果。我不能只是翻转顺序并将其更改为-179.00179.00之间,因为那样会返回边界框之外的内容。

最好地确定所需的适当SQL的最明智的方法是什么(作为SQL或有助于派生最佳SQL的伪代码(。

您可以做的一件事是在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.00179.00的纵向边界(将评估为

SELECT * 
FROM locations 
WHERE lon BETWEEN -179.0 AND 179.0
OR lon BETWEEN 181.0 AND 180.0 -- (always false)

在这个db<gt;fiddle(SQL Server示例(。

最新更新