6

Есть ли в SQL Server функция Max, принимающая два значения, как Math.Max в .NET?

1

Я хочу написать запрос, похожий на следующий:

SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o

Но, похоже, функция MAX не работает так, как я ожидал. Она является агрегатной функцией, которая принимает единственный параметр и возвращает максимальное значение среди всех строк.

Кто-нибудь знает, как реализовать это по моему желанию?

5 ответ(ов)

2

Это можно сделать в одну строку:

-- следующее выражение вычисляет ==> max(@val1, @val2)
SELECT 0.5 * ((@val1 + @val2) + ABS(@val1 - @val2))

Правка: Если вы работаете с очень большими числами, вам нужно будет преобразовать переменные значений в тип bigint, чтобы избежать переполнения целого числа.

1

Чтобы достичь синтаксиса, похожего на ваш пример, вам нужно будет создать Функцию, определённую пользователем (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

Таким образом, вы сможете применять вашу логику выбора максимального значения между двумя полями напрямую в запросе.

1

Почему бы не попробовать функцию IIF (требуется SQL Server 2012 и позже)?

IIF(a > b, a, b)

Вот и всё.

(Дополнительный совет: будьте осторожны, если a или b равны null, так как в этом случае результат a > b будет ложным. Таким образом, если одно из значений null, в качестве возвращаемого результата будет b.) (Также стоит отметить, что наличие null в колонках не является хорошей практикой с точки зрения проектирования системы.)

1

Я так не думаю. Я искал это на днях. Ближайшее, что мне удалось сделать, это:

SELECT
  o.OrderId,
  CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice 
       ELSE o.SuggestedPrice
  END 
FROM Order o

Если у вас есть дополнительные вопросы или нужна помощь, дайте знать!

0

Ваш код имеет синтаксическую ошибку в строке, где вы присваиваете значение переменной @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

Теперь код должен работать корректно.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь