Portée SQL à un cadre de sélection sur la ligne de changement de date

0

La question

Je suis en train de portée de ma requête pour sélectionner des emplacements qui sont à l'intérieur d'une boîte englobante de latitudes/longitudes. En général, cela fonctionne très bien compte tenu de la boîte englobante ne franchit pas la ligne de changement de date.

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

Cependant - si ma boîte englobante était de traverser la ligne de changement de date - dire longitudinale limites de 179.00 pour -179.00 alors, la requête ne renvoie aucun résultat. Je ne peux pas il suffit de retourner la commande et de le modifier pour entre -179.00 et 179.00 parce que ce serait plutôt le retour des choses à l'extérieur de ma zone de délimitation.

Qu'est-ce que le sanest manière de mieux déterminer les besoins en SQL requis (comme SQL ou psuedocode qui permettrait de tirer le meilleur SQL).

1

La meilleure réponse

1

Une chose que vous pourriez faire est d'utiliser CASE WHEN les expressions de la WHERE la clause de distinguer si le bas de votre longitudinale lié est plus grande que la supérieure, et de modifier le comportement en conséquence:

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

Pour votre exemple (longitudinale limites de 179.00 pour -179.00), cela aura le même effet que

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

alors que la même requête pour l'inversion de l'exemple (longitudinale limites de -179.00 pour 179.00évaluera à

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

Le voir en action dans cette db<>violon (SQL Server exemple).

2021-11-19 15:43:38

J'aime où cela va - je pense que c'est un bon plan pour le traduire en code qui pourrait générer SQL sans toujours à tort OU à l'alinéa.
Dwight

Dans d'autres langues

Cette page est dans d'autres langues

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