O escopo de SQL para uma caixa delimitadora sobre a linha internacional de data

0

Pergunta

Eu estou tentando âmbito minha consulta para selecionar os locais que estão dentro de uma caixa delimitadora de latitudes/longitudes. Geralmente isso funciona bem, dada a caixa delimitadora não cruzar a linha internacional de data.

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

Porém, se a minha caixa delimitadora foi a cruzar a linha internacional de data - dizer longitudinal limites de 179.00 para -179.00 em seguida, a consulta não retorna nenhum resultado. Eu não sou capaz de inverter a ordem e altere-a entre -179.00 e 179.00 porque que ao invés de retorno coisas fora da minha caixa delimitadora.

O que é a mais sã maneira para determinar melhor o SQL apropriado necessários (como SQL ou psuedocode que iria ajudar a tirar o melhor SQL).

1

Melhor resposta

1

Uma coisa que você pode fazer é usar CASE WHEN expressões no WHERE cláusula distinguir se o menor longitudinal vinculada é maior do que a superior e modificar o comportamento de acordo:

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

Por seu exemplo (longitudinal limites de 179.00 para -179.00), este terá o mesmo efeito como

SELECT * 
  FROM locations 
 WHERE lon BETWEEN -180.0 AND -179.0
    OR lon BETWEEN 179.0 AND 180.0

enquanto a mesma consulta para o invertido exemplo (longitudinal limites de -179.00 para 179.00) irá avaliar a

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

Vê-lo em ação no presente db<>violino (SQL Server exemplo).

2021-11-19 15:43:38

Eu gosto de onde isso vai dar - eu acho que é um bom plano para traduzir em um código que pode gerar SQL sem o sempre falsamente OU cláusula.
Dwight

Em outros idiomas

Esta página está em outros idiomas

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