Skip to content

Альтернативы функциям GREATEST и LEAST в SQL Server

Пересказ статьи Mike Scalise. GREATEST/LEAST Function Alternatives in SQL Server


Запрос к Microsoft, за который наиболее часто голосуют на feedback.azure.com, предлагает добавить MAX/MIN в качестве неагрегатных функций в SQL Server. Другими словами, это функции GREATEST и LEAST, которые мы можем увидеть в MySQL, PostgreSQL и Oracle.
Эти функции довольно просты по своей природе. Они возвращают наибольшее или наименьшее значение из списка значений или полей. Другими словами, наибольшее или наименьшее значение среди значений одной и той же строки. Поэтому несколько странно, почему нечто настолько простое и легко доступное в других СУБД не было включено в SQL Server...до сих пор...вроде.

С 14.04.21 Microsoft официально объявила, что функции GREATEST и LEAST имеются в базе данных SQL Azure и управляемом экземпляре SQL. Неофициально, кажется, что они тихо включили эти функции, по крайней мере, в управляемый экземпляр SQL несколькими месяцами ранее. Так или иначе, в настоящий момент у нас есть официальная документация на GREATEST и LEAST. Это отличные новости. Особенно приятно, что по заверениям Microsoft эти две функции будут включены в следующую версию SQL Server.

Но как быть тем, кто находится на SQL Server 2019 или более ранних версиях? К счастью, имеется способ имитировать поведение этих функций в запросах с помощью коррелирующего подзапроса в предложении SELECT.

В простейшей форме для списка постоянных значений мы можем использовать такой синтаксис:

SELECT (SELECT MAX(val) FROM 
(VALUES (10), (30), (20), (5)) val_tbl(val)) AS Greatest,(SELECT MIN(val) FROM
(VALUES (10), (30), (20), (5)) val_tbl(val)) AS Least;

А вот пример запроса для таблицы значений:

SELECT t.val1,
t.val2,
t.val3,
(SELECT MAX(val) FROM (VALUES (t.val1), (t.val2), (t.val3)) val_tbl(val)) AS Greatest,
(SELECT MIN(val) FROM (VALUES (t.val1), (t.val2), (t.val3)) val_tbl(val)) AS Least
FROM (VALUES (151,275,179),
(64,268,240),
(216,29,156),
(252,271,200)) t(val1, val2, val3);

Или, если так случилось, что у вас имеется база данных Stack Overflow, вы можете проверить такой пример:

SELECT p.Id,
p.AnswerCount,
p.CommentCount,
(SELECT MAX(val) FROM (VALUES (p.AnswerCount), (p.CommentCount)) val_tbl(val)) AS Greatest,
(SELECT MIN(val) FROM (VALUES (p.AnswerCount), (p.CommentCount)) val_tbl(val)) AS Least
FROM Posts p;

Хотя было бы здорово иметь эти функции прямо сейчас, я рад, что они уже на подходе и есть жизнеспособная альтернатива.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.