Definire SQL pentru o casetă de încadrare prin circuitul internațional

0

Problema

Încerc să sfera mea de interogare pentru a selecta locațiile care sunt într-o casetă de încadrare de latitudine/longitudine. În general, acest lucru funcționează bine, având în caseta de încadrare nu trece linia de data internațional.

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

Cu toate acestea - dacă-mi casetă de încadrare a fost de a traversa linia de data internațional - spune longitudinale limitele 179.00 pentru a -179.00 apoi interogarea returnează nici un rezultat. Nu pot răsturna ordinea si schimba-l la între -179.00 și 179.00 pentru că asta ar în loc să se întoarcă lucruri în afara mea casetă de încadrare.

Ceea ce este cel mai sanatos mod de a determina cel mai bun caz SQL necesare (fie ca SQL sau psuedocode care ar ajuta obține cele mai bune SQL).

1

Cel mai bun răspuns

1

Un lucru pe care ai putea face este de a utiliza CASE WHEN expresii în WHERE clauza de a distinge dacă longitudinale inferioare legat este mai mare decât cea superioară și modifica comportamentul în consecință:

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

Pentru exemplu (longitudinal limitele 179.00 pentru a -179.00), acest lucru va avea același efect ca

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

în timp ce aceeași interogare pentru a inversat exemplu (longitudinal limitele -179.00 pentru a 179.00) se va evalua la

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

Vezi-l în acțiune în această db<>vioara (SQL Server, de exemplu).

2021-11-19 15:43:38

Îmi place în cazul în care acest lucru se întâmplă - cred că e un bun plan de a traduce într-un cod care ar putea genera SQL fara întotdeauna în mod fals SAU clauză.
Dwight

În alte limbi

Această pagină este în alte limbi

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