Przeglądając to pytanie , wydaje się, że to dużo pracy, która nie powinna być potrzebna. Próbują rozszerzyć zakres o datę. W innych bazach danych wystarczy użyć greatest
i least
...
least(extendDate,min), greatest(extendDate,max)
Kiedy próbuję ich użyć, rozumiem
'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.
Obejmowałoby to rozszerzenie w obu kierunkach.
Na potrzeby tego pytania nadal musisz dokonać wyłącznej wymiany zakresu.
Zastanawiam się tylko, jak użytkownicy SQL Server implementują wzorce zapytań naśladując least
i greatest
funkcjonalność.
- PostgreSQL
GREATEST
/LEAST
- MySQL
GREATEST
/LEAST
- MariaDB
GREATEST
LEAST
- DB2
GREATEST
LEAST
- Wyrocznia
GREATEST
LEAST
Czy rozwijasz warunki w CASE
zestawieniach, czy istnieje rozszerzenie, dodatek strony trzeciej lub licencja od Microsoft, która umożliwia tę funkcjonalność?
sql-server
t-sql
feature-comparison
Evan Carroll
źródło
źródło
Odpowiedzi:
Jedną z powszechnych metod jest użycie
VALUES
klauzuli iCROSS APPLY
dwóch kolumn aliasowanych jako pojedyncza kolumna, a następnie pobranieMIN
iMAX
dla każdej z nich.Istnieją inne sposoby pisania, na przykład przy użyciu
UNION ALL
Jednak powstałe plany zapytań wydają się takie same.
źródło
Możesz również wstawić wartości w wierszu podzapytania. Lubię to:
źródło
To byłby dobry początek -
źródło
NAJMNIEJ równoważny:
NAJWIĘKSZY odpowiednik:
źródło
least(5,6,7,8,9)
?Tworzę funkcje zdefiniowane przez użytkownika, np
Chociaż może to działać w prostych przypadkach, z tym podejściem wiąże się kilka problemów:
least
robi operator w Oracle i MySQL, ale różni się od Postgres. Ale to zbrojenie przeciw zeru sprawia, że jest bardziej gadatliwy (jeśli wiesz, że nie będą zerowe, zwykłycase when @a <= @b then @a else @b end
działałby).Podsumowując, może być lepiej napisać
case
wyciąg z instrukcji, jeśli wydajność ma znaczenie. Korzystałem nawet z generowania zagnieżdżonychcase
instrukcji po stronie klienta, gdy istnieje kilka wartości do porównania.źródło
Zamierzałem dodać komentarz do odpowiedzi @ ed-avis, ale nie mogłem tego zrobić z powodu braku reputacji, dlatego opublikowałem to jako rozszerzenie jego odpowiedzi.
Wyeliminowałem wadę „Irytująco musisz tworzyć osobne funkcje dla każdego typu danych”. Korzystanie z SQL_VARIANT .
Oto moja implementacja:
Również ta funkcja obsługuje NULL- y jak wersja postgresql.
Dla wygody można tę funkcję dodać do DB, ale jest ona 10 razy wolniejsza niż przy użyciu wbudowanego
IIF
. Moje testy pokazują, że taka funkcja z dokładnym typem ( datetime ) działa tak samo jak wersja sql_variant .PS I przeprowadzić kilka testów na zestaw danych o wartości 350k, a wydaje się, że wydajność jest taka sama, sql_variant jest odrobinę szybciej, ale wierzę, że to tylko trema.
Ale w każdym razie wersja IIF jest 10 razy szybsza !!!
Nie testowałem inline,
CASE WHEN
ale w zasadzie dla t-sql IIF jest taki sam jak wielkość liter , a iif get jest konwertowany przez optymalizator do wyrażenia wielkości liter.WNIOSEK: Szybsze jest korzystanie z IIF, jeśli wydajność ma znaczenie, ale do prototypowania lub jeśli wymagana jest klarowność kodu i nie są wymagane duże obliczenia, pod warunkiem, że można użyć funkcji.
źródło