Есть ли в 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
Теперь код должен работать корректно.
"Вставка результатов хранимой процедуры в временную таблицу"
Обновление данных в одной таблице из другой на основе совпадения ID
Как вставить перенос строки в строке VARCHAR/NVARCHAR SQL Server
Возможно ли задать условия в Count()?
with(nolock) или (nolock) - есть ли разница?