Scoping SQL, aby ohraničovací rámeček přes datovou hranici

0

Otázka

Snažím se rozsah mého dotazu na vybraných lokalitách, které jsou uvnitř ohraničovacího rámečku šířky/délky. Obecně to funguje dobře, vzhledem k tomu vymezovací rámeček není přes mezinárodní datové linie.

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

Nicméně - pokud můj vymezovací rámeček byl k překročení mezinárodní datové hranice - řekněme podélné hranice 179.00 k -179.00 pak se vrátí dotaz žádné výsledky. Já prostě nemůžu otočit pořadí, a změnit to, aby mezi -179.00 a 179.00 protože to by místo vrátit věci mimo můj vymezovací rámeček.

Co je to nejrozumnější způsob, jak nejlépe určit odpovídající SQL vyžaduje (buď jako SQL nebo psuedocode, že pomůže odvodit nejlepší SQL).

1

Nejlepší odpověď

1

Jedna věc, kterou můžete udělat, je použít CASE WHEN výrazy v WHERE doložka rozlišit, zda vaše spodní podélné mez je větší než horní a upravit chování:

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

Pro váš příklad (podélné hranice 179.00 k -179.00), bude to mít stejný efekt jako

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

zatímco stejný dotaz pro obrácený příklad (podélné hranice -179.00 k 179.00) zhodnotí na

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

Vidět v akci v tomto db<>housle (SQL Server například).

2021-11-19 15:43:38

Jsem rád, kde to jde - myslím, že je to dobrý plán, aby přeložit do kódu, který může generovat SQL, aniž by vždy nepravdivě NEBO doložky.
Dwight

V jiných jazycích

Tato stránka je v jiných jazycích

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