界定范围的SQL来的边界框在国际日期变更线

0

的问题

我想我的查询范围,选择地点,在边界框纬度/经度。 通常这一工作给予的边界框并不十字国际日期变更线。

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

然而,如果我bounding box是跨越国际日期变更线-说纵向范围 179.00-179.00 然后返回查询,没有结果。 我不能只需翻转次序,并改变它之间 -179.00179.00 因为那会而不是返回的事情之外,我的边界框。

什么是比较好的方式最好地确定适当的SQL需要(无论是作为SQL或psuedocode,这将有助于获得最佳的SQL)。

1

最好的答案

1

一件事你能做的就是使用 CASE WHEN 表达式 WHERE 条款区分是否低纵向往大于上一和修改的行为,因此:

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)

看到它在行动中 此数据库<>小提琴(SQL服务器的例子).

2021-11-19 15:43:38

我喜欢这是怎么回事-我认为这是一个很好的蓝图转化为一些代码,可能产生SQL不总是虚假或条款。
Dwight

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................