Рассматривая этот вопрос, кажется, что это большая работа, которая не должна быть необходима. Они пытаются расширить диапазон датой. В других базах данных вы просто используете greatest
и least
..
least(extendDate,min), greatest(extendDate,max)
Когда я пытаюсь использовать их, я получаю
'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.
Это будет охватывать расширение в любом направлении.
Для целей вопроса вам все равно придется делать исключительную замену диапазона.
Мне просто интересно, как пользователи SQL Server реализуют шаблоны запросов для имитации least
и greatest
функциональности.
- PostgreSQL
GREATEST
/LEAST
- MySQL
GREATEST
/LEAST
- MariaDB
GREATEST
LEAST
- DB2
GREATEST
LEAST
- оракул
GREATEST
LEAST
Развертываете ли вы условия в CASE
заявлениях или есть расширение, сторонняя надстройка или лицензия от Microsoft, которая включает эту функцию?
sql-server
t-sql
feature-comparison
Эван Кэрролл
источник
источник
LEAST
/GREATEST
функций - почти все конкуренты RDBMS имеют как минимум эквиваленты. Единственное исключение, которое я смог найти, - это Sybase, но это также было прекращено в течение многих лет.Ответы:
Один из распространенных методов - использовать
VALUES
предложение, иCROSS APPLY
два столбца с псевдонимами будут представлены как один столбец, а затем получитьMIN
иMAX
каждого.Есть и другие способы написания, например, используя
UNION ALL
Тем не менее, итоговые планы запросов выглядят одинаково.
источник
Вы также можете поместить значения встроенными в подзапрос. Как это:
источник
Это было бы хорошим началом -
источник
Меньше всего эквивалент:
САМЫЙ БОЛЬШОЙ эквивалент
источник
least(5,6,7,8,9)
?Я создаю пользовательские функции, например
Хотя это может работать в простых случаях, однако есть несколько проблем с этим подходом:
least
оператор делает в Oracle и MySQL, но отличается от Postgres. Но эта защита от нуля делает его более многословным (если вы знаете, что они не будут нулевыми,case when @a <= @b then @a else @b end
сработает простая ).В целом, может быть, лучше написать
case
выписку, если производительность имеет значение. Я даже прибегал к генерации вложенныхcase
операторов на стороне клиента, когда есть несколько значений для сравнения.источник
Я собирался добавить комментарий к ответу @ ed-avis, но не смог этого сделать из-за отсутствия репутации, поэтому разместил это как продолжение своего ответа.
Я устранил недостаток: «Досадно, что вы должны создавать отдельные функции для каждого типа данных». Использование SQL_VARIANT .
Вот моя реализация:
Также эта функция обрабатывает NULL как версия postgresql.
Эту функцию можно добавить в БД для удобства, но она в 10 раз медленнее , чем встроенная
IIF
. Мои тесты показывают, что такая функция с точным типом ( datetime ) выполняет так же, как версия sql_variant .PS Я запускаю несколько тестов для набора данных со значениями в 350 тыс., И кажется, что производительность одинакова, sql_variant чуть-чуть быстрее, но я считаю, что это просто дрожь.
Но в любом случае версия IIF в 10 раз быстрее !!!
Я не тестировал inline,
CASE WHEN
но в основном для t-sql IIF такой же, как case , и iif get конвертируется оптимизатором в case case.ЗАКЛЮЧЕНИЕ: быстрее использовать IIF, если производительность имеет значение, но для прототипирования или если ясность кода более необходима и не требуются большие вычисления, при условии, что можно использовать функцию.
источник
iif(a<b, a, b)
в 10 раз быстрее, чем любая пользовательская функция.IIF()
- быстрее, чем использованиеCASE
выражения? Я хочу сказать, что, поскольку вы столкнулись с проблемой тестирования производительности, вы должны протестировать все предложенные методы / ответы.