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

Есть способы перенаправления событий в элемент управления, но не ожидайте, что вы сможете легко запускать события в управление огнем самостоятельно, поскольку браузеры будут пытаться заблокировать это (хорошие) соображения безопасности.

Если вам нужно только открыть диалоговое окно файла, когда пользователь нажмет что-нибудь, скажем, потому что вам нужны более удобные кнопки для загрузки файлов, то вы можете взглянуть на , что Шон Инман пришел с .

Мне удалось добиться запуска клавиатуры с творческим переключением фокуса внутри и вне контроля между keydown, keypress & amp; события для создания ключей. YMMV.

. Мой искренний совет - оставить это в покое, потому что это мир несовместимости с браузером. Незначительные обновления браузера могут также блокировать трюки без предупреждения, и вам, возможно, придется повторно изобретать хаки, чтобы он работал.

444
задан Johan 30 June 2011 в 11:46
поделиться

11 ответов

Необходимо было бы сделать User-Defined Function, если бы Вы хотели иметь синтаксис, подобный Вашему примеру, но могли Вы делать то, что Вы хотите сделать, встроить, довольно легко с 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
145
ответ дан SteveC 30 June 2011 в 11:46
поделиться
SELECT o.OrderID
CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN
 o.NegotiatedPrice
ELSE
 o.SuggestedPrice
END AS Price
1
ответ дан Wayne 30 June 2011 в 11:46
поделиться

Можно сделать что-то вроде этого:

select case when o.NegotiatedPrice > o.SuggestedPrice 
then o.NegotiatedPrice
else o.SuggestedPrice
end
1
ответ дан Per Hornshøj-Schierbeck 30 June 2011 в 11:46
поделиться

Я пошел бы с решением, предоставленным , kcrumley Просто изменяет его немного для обработки, АННУЛИРУЕТ

create function dbo.HigherArgumentOrNull(@val1 int, @val2 int)
returns int
as
begin
  if @val1 >= @val2
    return @val1
  if @val1 < @val2
    return @val2

 return NULL
end

РЕДАКТИРОВАНИЕ Измененный после комментария от Mark. Поскольку он правильно указал в 3 оцененных логиках x> на ПУСТОЙ УКАЗАТЕЛЬ или x < ПУСТОЙ УКАЗАТЕЛЬ должен всегда возвращать ПУСТОЙ УКАЗАТЕЛЬ. Другими словами, неизвестный результат.

5
ответ дан Community 30 June 2011 в 11:46
поделиться

Другие ответы хороши, но если необходимо волноваться о наличии Нулевых значений, можно хотеть этот вариант:

SELECT o.OrderId, 
   CASE WHEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice) > ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
        THEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice)
        ELSE ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
   END
FROM Order o
11
ответ дан 30 June 2011 в 11:46
поделиться

Я не думаю так. Я хотел это на днях. Самое близкое, которое я получил, было:

SELECT
  o.OrderId,
  CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice 
     ELSE o.SuggestedPrice
  END
FROM Order o
122
ответ дан Scott Langham 30 June 2011 в 11:46
поделиться

Я, вероятно, не сделал бы этого этот путь, поскольку это менее эффективно, чем уже упомянутые конструкции CASE - если, возможно, у Вас не было закрывающих индексов для обоих запросов. Так или иначе это - полезная техника для подобных проблем:

SELECT OrderId, MAX(Price) as Price FROM (
   SELECT o.OrderId, o.NegotiatedPrice as Price FROM Order o
   UNION ALL
   SELECT o.OrderId, o.SuggestedPrice as Price FROM Order o
) as A
GROUP BY OrderId
2
ответ дан Mark Brackett 30 June 2011 в 11:46
поделиться

Ой, я просто отправил простофиля этого вопроса ...

ответ, существует не создано в функции как Oracle, Самая Большая , но можно достигнуть подобного результата для 2 столбцов с UDF, отметьте, использование sql_variant довольно важно здесь.

create table #t (a int, b int) 

insert #t
select 1,2 union all 
select 3,4 union all
select 5,2

-- option 1 - A case statement
select case when a > b then a else b end
from #t

-- option 2 - A union statement 
select a from #t where a >= b 
union all 
select b from #t where b > a 

-- option 3 - A udf
create function dbo.GREATEST
( 
    @a as sql_variant,
    @b as sql_variant
)
returns sql_variant
begin   
    declare @max sql_variant 
    if @a is null or @b is null return null
    if @b > @a return @b  
    return @a 
end


select dbo.GREATEST(a,b)
from #t

kristof

Отправил этот ответ:

create table #t (id int IDENTITY(1,1), a int, b int)
insert #t
select 1,2 union all
select 3,4 union all
select 5,2

select id, max(val)
from #t
    unpivot (val for col in (a, b)) as unpvt
group by id
3
ответ дан Community 30 June 2011 в 11:46
поделиться

Может быть сделан в одной строке:

-- the following expression calculates ==> max(@val1, @val2)
SELECT 0.5 * ((@val1 + @val2) + ABS(@val1 - @val2)) 

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

209
ответ дан splattne 30 June 2011 в 11:46
поделиться
DECLARE @MAX INT
@MAX = (SELECT MAX(VALUE) 
               FROM (SELECT 1 AS VALUE UNION 
                     SELECT 2 AS VALUE) AS T1)
32
ответ дан 22 November 2019 в 23:01
поделиться
CREATE FUNCTION [dbo].[fnMax] (@p1 INT, @p2 INT)
RETURNS INT
AS BEGIN

    DECLARE @Result INT

    SET @p2 = COALESCE(@p2, @p1)

    SELECT
        @Result = (
                   SELECT
                    CASE WHEN @p1 > @p2 THEN @p1
                         ELSE @p2
                    END
                  )

    RETURN @Result

END
1
ответ дан 22 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: