Określenie dziedzinie SQL w ograniczającym pole w wierszu międzynarodowej chcesz

0

Pytanie

Staram się poszerzyć obszar swojego żądania, aby wybrać lokalizacje, które znajdują się w granicach prostokąta ograniczającego szerokości/długości geograficznych. Zazwyczaj działa to dobrze, biorąc pod uwagę, że ograniczenie ramka nie przecina międzynarodową linię dat.

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

Jednak - gdyby moja ramka ograniczająca taflę międzynarodową linię dat - powiedzmy, podłużne granicy 179.00 Dla -179.00 następnie zapytanie nie zwraca żadnych wyników. Nie mogę po prostu odwrócić porządek i zmienić go na między -179.00 i 179.00 bo to zamiast tego zwróciło by rzeczy poza moim ramki ograniczającej.

Jaki jest lepszy sposób, aby jak najlepiej określić wymagany odpowiedni SQL (albo w postaci SQL, albo w postaci psuedocode, który pomoże uzyskać najlepszy SQL).

1

Najlepsza odpowiedź

1

Jedyne, co można zrobić, to użyć CASE WHEN wyrażenia w WHERE propozycja, aby określić, czy więcej twoim dolny drążek granica, niż górna i odpowiednio zmienić zachowanie:

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

Dla twojej przykład (podłużne granicy 179.00 Dla -179.00), to będzie miał ten sam efekt, co i

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

podczas gdy to samo zapytanie do odwróconego przykład (podłużne granicy -179.00 Dla 179.00) będzie oceniać

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

Zobacz go w akcji w tym bazy danych<>fiddle (na przykład SQL Server)<>.

2021-11-19 15:43:38

Podoba mi się, do czego to prowadzi - myślę, że to dobry plan do tłumaczenia w jakiś kod, który mógłby generować SQL bez oferty zawsze fałszywie LUB.
Dwight

W innych językach

Ta strona jest w innych językach

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