我正在尝试确定查询范围,以选择纬度/经度边界框内的位置。一般来说,如果边界框不越过国际日期线,这很好。
SELECT *
FROM locations
WHERE latitude BETWEEN ? AND ?
AND longitude BETWEEN ? AND ?
但是,如果我的边界框要越过国际日期线,比如179.00
到-179.00
的纵向边界,那么查询不会返回任何结果。我不能只是翻转顺序并将其更改为-179.00
和179.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.00
到179.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示例(。