Альтернативы функциям 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.
В простейшей форме для списка постоянных значений мы можем использовать такой синтаксис:
А вот пример запроса для таблицы значений:
Или, если так случилось, что у вас имеется база данных Stack Overflow, вы можете проверить такой пример:
Хотя было бы здорово иметь эти функции прямо сейчас, я рад, что они уже на подходе и есть жизнеспособная альтернатива.
С 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;
Хотя было бы здорово иметь эти функции прямо сейчас, я рад, что они уже на подходе и есть жизнеспособная альтернатива.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой