Rozhľadu SQL na ohraničenie cez medzinárodné dátum line

0

Otázka

Snažím sa, rozsah môj dotaz na vybraných miestach, ktoré sú v ohraničenie zemepisnej šírky/dĺžky. Vo všeobecnosti to funguje vzhľadom na ohraničenie nemá kríž medzinárodný deň linky.

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

Avšak - ak moje ohraničenie bolo kríž medzinárodného dňa line - povedať, pozdĺžne hranice 179.00 na -179.00 potom dotaz vráti žiadne výsledky. Nemôžem si jednoducho poradí a zmeniť ju na medzi -179.00 a 179.00 pretože to by namiesto vrátiť veci mimo mojej ohraničenie.

Čo je sanest spôsob, ako najlepšie určiť vhodné SQL vyžaduje (buď ako je SQL alebo psuedocode, ktoré by pomohli odvodiť najlepšie SQL).

1

Najlepšiu odpoveď

1

Jedna vec, ktorú môžete urobiť, je použiť CASE WHEN výrazy v WHERE ustanovenie rozlíšiť, či dolnej pozdĺžne lepidlom je väčší, než hornom a zmeniť správanie spôsobom:

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

Pre váš príklad (pozdĺžne hranice 179.00 na -179.00), bude to mať rovnaký efekt ako

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

zatiaľ čo rovnaká otázka pre ená príklad (pozdĺžne hranice -179.00 na 179.00) bude hodnotiť, aby

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

Vidieť ho v akcii v tejto db - <>husle (SQL Server príklad).

2021-11-19 15:43:38

Som rád, kde to bude, myslím si, že je to dobrý plán preložiť do niektorých kód, ktorý by mohol generovať SQL bez vždy nepravdivé ALEBO doložky.
Dwight

V iných jazykoch

Táto stránka je v iných jazykoch

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