我想写一个这样的查询:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
但这不是MAX函数的工作原理,对吧?它是一个聚合函数,因此它需要一个参数,然后返回所有行的MAX。
有人知道我的方法吗?
我想写一个这样的查询:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
但这不是MAX函数的工作原理,对吧?它是一个聚合函数,因此它需要一个参数,然后返回所有行的MAX。
有人知道我的方法吗?
当前回答
如果你想拥有与你的例子相似的语法,你需要创建一个用户定义的函数,但是你能像其他人所说的那样,用一个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 OrderId, (
select max([Price]) from (
select NegotiatedPrice [Price]
union all
select SuggestedPrice
) p
) from [Order]
是的,有。
T-SQL (SQL Server 2022 (16.x))现在支持最大/最小函数:
MAX/MIN作为非聚合函数 现在Azure SQL数据库和SQL托管实例都支持这个功能。它将滚动到下一个版本的SQL Server。
逻辑函数- GREATEST (Transact-SQL) 此函数返回一个或多个表达式列表中的最大值。 最伟大的表达,…n)
在这种情况下:
SELECT o.OrderId, GREATEST(o.NegotiatedPrice, o.SuggestedPrice)
FROM [Order] o;
db < > fiddle演示
如果你想拥有与你的例子相似的语法,你需要创建一个用户定义的函数,但是你能像其他人所说的那样,用一个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
对于上面关于大数字的答案,你可以在加减法之前做乘法。它有点笨重,但不需要石膏。(我不能说速度,但我认为它仍然非常快)
选择0.5*((@val1+@val2)+ ABS(@val1 - @val2)
更改
选择 @val1*0.5+@val2*0.5 + ABS(@val1*0.5 - @val2*0.5)
如果你想避免强制转换,至少有一个替代方案。