Sql'i uluslararası tarih satırı üzerinden sınırlayıcı bir kutuya kapsamlandırma

0

Soru

Sınırlayıcı bir enlem/boylam kutusu içindeki konumları seçmek için sorgumu kapsamlandırmaya çalışıyorum. Genellikle bu, sınırlayıcı kutunun uluslararası tarih çizgisini geçmediği göz önüne alındığında iyi çalışır.

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

Ancak - sınırlayıcı kutum uluslararası tarih çizgisini geçecekse-uzunlamasına sınırları söyleyin 179.00 -e doğru -179.00 sonra sorgu sonuç döndürmez. Siparişi ters çevirip aralarında değiştiremem. -179.00 ve 179.00 çünkü bu, sınırlayıcı kutumun dışındaki şeyleri geri getirir.

Gerekli uygun sql'i en iyi şekilde belirlemenin en mantıklı yolu nedir(en iyi sql'i türetmeye yardımcı olacak SQL veya psuedocode olarak).

1

En iyi cevabı

1

Yapabileceğin tek şey kullanmak. CASE WHEN ifadeler WHERE alt uzunlamasına sınırınızın üst sınırdan daha büyük olup olmadığını ayırt etmek ve davranışı buna göre değiştirmek için yan tümce:

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

Örneğiniz için (uzunlamasına sınırlar 179.00 -e doğru -179.00), bu aynı etkiye sahip olacaktır

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

ters çevrilmiş örnek için aynı sorgu olsa da (uzunlamasına sınırlar -179.00 -e doğru 179.00 will değerlendirmek için

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

Bu db<>kemanında (SQL Server örneği) eylemde görün<>.

2021-11-19 15:43:38

Bunun nereye gittiğini seviyorum-bence her zaman yanlış VEYA yan tümce olmadan SQL üretebilecek bazı kodlara çevirmek için iyi bir plan.
Dwight

Diğer dillerde

Bu sayfa diğer dillerde

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