Ambito SQL in una casella di delimitazione oltre la linea del cambiamento di data

0

Domanda

Sto cercando di ambito mia query per selezionare le posizioni che sono all'interno di una casella di delimitazione delle latitudini/longitudini. Generalmente questo funziona bene dato il riquadro di delimitazione non attraversare la linea del cambiamento di data.

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

Tuttavia - se la mia casella di delimitazione era quello di attraversare la linea del cambiamento di data - dire longitudinale limiti di 179.00 per -179.00 quindi la query non restituisce alcun risultato. Non posso capovolgere l'ordine e la si cambia tra -179.00 e 179.00 perché, invece, tornare le cose al di fuori della mia casella di delimitazione.

Qual è la più sana modo migliore per determinare le appropriate istruzioni SQL necessarie (come SQL o psuedocode che potrebbe aiutare a ottenere le migliori SQL).

1

Migliore risposta

1

Una cosa che potreste fare è usare CASE WHEN espressioni in WHERE clausola di distinguere se il tuo basso longitudinale vincolato è maggiore di quella superiore e modificare il comportamento di conseguenza:

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

Per il tuo esempio (longitudinale limiti di 179.00 per -179.00), questo si ottiene lo stesso effetto

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

mentre la stessa query per l'inverted esempio (longitudinale limiti di -179.00 per 179.00) viene valutato

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

Vederlo in azione in questo db<>violino (SQL Server esempio).

2021-11-19 15:43:38

Mi piace dove questo sta andando, penso sia un buon progetto per tradurre in codice che potrebbe generare SQL senza sempre falsamente O clausola.
Dwight

In altre lingue

Questa pagina è in altre lingue

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