Есть ли в SQL Server функция Max, принимающая два значения, как Math.Max в .NET?
Я хочу написать запрос, похожий на следующий:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Но, похоже, функция MAX
не работает так, как я ожидал. Она является агрегатной функцией, которая принимает единственный параметр и возвращает максимальное значение среди всех строк.
Кто-нибудь знает, как реализовать это по моему желанию?
5 ответ(ов)
Это можно сделать в одну строку:
-- следующее выражение вычисляет ==> max(@val1, @val2)
SELECT 0.5 * ((@val1 + @val2) + ABS(@val1 - @val2))
Правка: Если вы работаете с очень большими числами, вам нужно будет преобразовать переменные значений в тип bigint, чтобы избежать переполнения целого числа.
Чтобы достичь синтаксиса, похожего на ваш пример, вам нужно будет создать Функцию, определённую пользователем (UDF)
, однако, как уже отмечали другие участники, вы можете вполне легко реализовать нужную вам логику с помощью оператора CASE
в инлайне.
UDF
может выглядеть следующим образом:
create function dbo.InlineMax(@val1 int, @val2 int)
returns int
as
begin
if @val1 > @val2
return @val1
return isnull(@val2, @val1)
end
И вы вызовете её вот так:
SELECT o.OrderId, dbo.InlineMax(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Таким образом, вы сможете применять вашу логику выбора максимального значения между двумя полями напрямую в запросе.
Почему бы не попробовать функцию IIF (требуется SQL Server 2012 и позже)?
IIF(a > b, a, b)
Вот и всё.
(Дополнительный совет: будьте осторожны, если a
или b
равны null
, так как в этом случае результат a > b
будет ложным. Таким образом, если одно из значений null
, в качестве возвращаемого результата будет b
.) (Также стоит отметить, что наличие null
в колонках не является хорошей практикой с точки зрения проектирования системы.)
Я так не думаю. Я искал это на днях. Ближайшее, что мне удалось сделать, это:
SELECT
o.OrderId,
CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice
ELSE o.SuggestedPrice
END
FROM Order o
Если у вас есть дополнительные вопросы или нужна помощь, дайте знать!
Ваш код имеет синтаксическую ошибку в строке, где вы присваиваете значение переменной @MAX
. В T-SQL для присваивания значения переменной нужно использовать конструкцию SET
или SELECT
, а не просто указывать @MAX =
. Вот исправленный вариант:
DECLARE @MAX INT
SET @MAX = (SELECT MAX(VALUE)
FROM (SELECT 1 AS VALUE UNION
SELECT 2 AS VALUE) AS T1)
Или вы можете использовать SELECT
напрямую для присваивания:
DECLARE @MAX INT
SELECT @MAX = MAX(VALUE)
FROM (SELECT 1 AS VALUE UNION
SELECT 2 AS VALUE) AS T1
Теперь код должен работать корректно.
Как конкатенировать текст из нескольких строк в одну строку в SQL Server
"Вставка результатов хранимой процедуры в временную таблицу"
Как выполнить оператор UPDATE с JOIN в SQL Server?
Обновление данных в одной таблице из другой на основе совпадения ID
Следует ли мне использовать != или <> для обозначения "не равно" в T-SQL?