Есть способы перенаправления событий в элемент управления, но не ожидайте, что вы сможете легко запускать события в управление огнем самостоятельно, поскольку браузеры будут пытаться заблокировать это (хорошие) соображения безопасности.
Если вам нужно только открыть диалоговое окно файла, когда пользователь нажмет что-нибудь, скажем, потому что вам нужны более удобные кнопки для загрузки файлов, то вы можете взглянуть на , что Шон Инман пришел с .
Мне удалось добиться запуска клавиатуры с творческим переключением фокуса внутри и вне контроля между keydown, keypress & amp; события для создания ключей. YMMV.
. Мой искренний совет - оставить это в покое, потому что это мир несовместимости с браузером. Незначительные обновления браузера могут также блокировать трюки без предупреждения, и вам, возможно, придется повторно изобретать хаки, чтобы он работал.
Необходимо было бы сделать 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
SELECT o.OrderID
CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN
o.NegotiatedPrice
ELSE
o.SuggestedPrice
END AS Price
Можно сделать что-то вроде этого:
select case when o.NegotiatedPrice > o.SuggestedPrice
then o.NegotiatedPrice
else o.SuggestedPrice
end
Я пошел бы с решением, предоставленным , 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 < ПУСТОЙ УКАЗАТЕЛЬ должен всегда возвращать ПУСТОЙ УКАЗАТЕЛЬ. Другими словами, неизвестный результат.
Другие ответы хороши, но если необходимо волноваться о наличии Нулевых значений, можно хотеть этот вариант:
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
Я не думаю так. Я хотел это на днях. Самое близкое, которое я получил, было:
SELECT
o.OrderId,
CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice
ELSE o.SuggestedPrice
END
FROM Order o
Я, вероятно, не сделал бы этого этот путь, поскольку это менее эффективно, чем уже упомянутые конструкции 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
Ой, я просто отправил простофиля этого вопроса ...
ответ, существует не создано в функции как 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
Отправил этот ответ:
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
Может быть сделан в одной строке:
-- the following expression calculates ==> max(@val1, @val2)
SELECT 0.5 * ((@val1 + @val2) + ABS(@val1 - @val2))
Редактирование: , Если Вы имеете дело с очень большими количествами, необходимо будет преобразовать переменные значения в bigint для предотвращения целочисленного переполнения.
DECLARE @MAX INT
@MAX = (SELECT MAX(VALUE)
FROM (SELECT 1 AS VALUE UNION
SELECT 2 AS VALUE) AS T1)
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