Я хочу написать запрос так:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Но это не так, как MAX
работает функция, верно? Это агрегатная функция, поэтому она ожидает один параметр, а затем возвращает MAX всех строк.
Кто-нибудь знает, как это сделать по-моему?
sql
sql-server
max
SKB
источник
источник
GREATEST
функция; SQLite эмулирует поддержку, позволяя использовать несколько столбцов вMAX
совокупности.Ответы:
Вам нужно было бы сделать,
User-Defined Function
если бы вы хотели, чтобы синтаксис был похож на ваш пример, но вы могли бы делать то, что вы хотите, встроенные, довольно легко сCASE
заявлением, как сказали другие.UDF
Может быть что - то вроде этого:... и вы бы назвали это так ...
источник
Если вы используете SQL Server 2008 (или выше), то это лучшее решение:
Все кредиты и голоса должны идти к ответу Свена на связанный вопрос: «SQL MAX из нескольких столбцов?»
Я говорю, что это « лучший ответ », потому что:
SELECT MAX (a), MAX (b) FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) AS MyTable (a, b)
источник
Можно сделать в одну строку:
Изменить: Если вы имеете дело с очень большими числами, вам придется преобразовать переменные значения в bigint, чтобы избежать переполнения целых чисел.
источник
Я так не думаю. Я хотел этого на днях. Самое близкое, что я получил, было:
источник
Почему бы не попробовать функцию IIF (требуется SQL Server 2012 и более поздние версии)
Вот и все.
(Подсказка: будьте осторожны с любым из них
null
, так как результатa>b
будет ложным, когда любой из них равен нулю. Такb
будет и в этом случае)источник
NULL
, результатом всегда будет второе.NULL > 1234
утверждение ложноIIF(a>b, a, COALESCE(b,a))
чтобы дать значение, когда существует только одинисточник
Другие ответы хороши, но если вам нужно беспокоиться о значениях NULL, вам может потребоваться этот вариант:
источник
В SQL Server 2012 или более поздней версии вы можете использовать комбинацию
IIF
иISNULL
(илиCOALESCE
), чтобы получить максимум 2 значения.Даже когда 1 из них равен NULL.
Или, если вы хотите, чтобы он возвращал 0, когда оба NULL
Пример фрагмента:
Результат:
Но если нужно суммировать несколько значений?
Тогда я предлагаю ПЕРЕКРЕСТИТЬ ПРИМЕНЕНИЕ к совокупности ЗНАЧЕНИЙ.
Это также имеет то преимущество, что он может рассчитывать другие вещи одновременно.
Пример:
источник
Подзапросы могут получать доступ к столбцам из внешнего запроса, поэтому вы можете использовать этот подход для использования агрегатов, например,
MAX
по столбцам. (Возможно, более полезно, когда задействовано большее количество столбцов)источник
VALUES
синтаксис лучше.SQL Server 2012 представил
IIF
:При использовании рекомендуется использовать NULL
IIF
, потому что aNULL
с любой стороны от васboolean_expression
вызоветIIF
возвратfalse_value
(в отличие отNULL
).источник
Я хотел бы пойти с решением, предоставленным kcrumley Просто измените его немного, чтобы обрабатывать NULL
РЕДАКТИРОВАТЬ Изменено после комментария от Марка . Как он правильно указал в трехзначной логике, x> NULL или x <NULL всегда должны возвращать NULL. Другими словами, неизвестный результат.
источник
Это так просто:
источник
источник
Ой, я только что опубликовал дупе этого вопроса ...
Ответ заключается в том, что нет встроенной функции, подобной Oracle Greatest , но вы можете достичь аналогичного результата для 2 столбцов с UDF, обратите внимание, что использование sql_variant здесь очень важно.
Кристофа
Разместил этот ответ:
источник
Вот пример случая, который должен обрабатывать пустые значения и работать со старыми версиями MSSQL. Это основано на встроенной функции в одном из популярных примеров:
источник
Я, вероятно, не стал бы делать это таким образом, поскольку он менее эффективен, чем уже упомянутые конструкции CASE - если, возможно, у вас не было охватывающих индексов для обоих запросов. В любом случае, это полезный метод для подобных проблем:
источник
Для ответа выше относительно больших чисел вы можете выполнить умножение перед сложением / вычитанием. Это немного громоздче, но не требует приведения. (Я не могу говорить о скорости, но я предполагаю, что это все еще довольно быстро)
Изменения к
по крайней мере, альтернатива, если вы хотите избежать кастинга.
источник
Вот версия IIF с обработкой NULL (на основе ответа Xin):
Логика следующая: если любое из значений равно NULL, вернуть значение, которое не равно NULL (если оба значения равны NULL, возвращается NULL). В противном случае верните большее.
То же самое можно сделать для MIN.
источник
Вы можете сделать что-то вроде этого:
источник
источник
источник
В простейшем виде ...
источник
Для SQL Server 2012:
источник
Вот ответ @Scott Langham с простой обработкой NULL:
источник
источник
источник
VALUES
inline, как это, я не уверен, что это проще, чемCASE
илиIFF
. Мне было бы интересно посмотреть, как производительность этого решения сочетается с другими вариантами, хотяРасширяя ответ Xin и предполагая, что типом значения сравнения является INT, этот подход также работает:
Это полный тест с примерами значений:
источник
В MemSQL сделайте следующее:
источник
В Presto вы можете использовать
источник