问题描述
如题,在SQL Server
中,是否存在一个函数,可以按两个字段查询最大值,比如这样的查询语句:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
我们知道,在SQL Server
中是有内置的MAX()
函数,但这个内置的MAX()
函数是用于返回一列中的最大值。NULL 值不包括在计算中,但它只是针对一个字段进行处理。
提示:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
现在,要求按两个字段查找最大值,在SQL Server
中,我们又可以如何实现呢?
方案一
在SQL Server
中,如需实现按两个字段查找最大值,我们可以使用用户自定义函数:User-Defined Function
,用户自定义函数的写法类似如下:
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
方案二
如果是SQL Server 2008
或者以上版本,我们也可以不要自定义函数 而,直接使用如下这个解决方案:
SELECT o.OrderId,
(SELECT MAX(Price)
FROM (VALUES (o.NegotiatedPrice),(o.SuggestedPrice)) AS AllPrices(Price))
FROM Order o
方案三
使用SQL Server
的CASE WHEN
语句也可以实现同样的效果,如:
SELECT
o.OrderId,
CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice
ELSE o.SuggestedPrice
END
FROM Order o
方案四
如果我们在SQL Server
2012或者以上版本中,我们也可以使用IIF
函数,如:
IIF(a>b,a,b)
具体的示例如:
SELECT
o.OrderId,
IIF( ISNULL( o.NegotiatedPrice, 0 ) > ISNULL( o.SuggestedPrice, 0 ),
o.NegotiatedPrice,
o.SuggestedPrice
)
FROM
Order o
方案五
DECLARE @MAX INT
@MAX = (SELECT MAX(VALUE)
FROM (SELECT 1 AS VALUE UNION
SELECT 2 AS VALUE) AS T1)
方案六
如果在CASE WHEN
语句中,还需要考虑NULL
值的话,这样解决会更好:
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
方案七
使用子查询来实现:
;WITH [Order] AS
(
SELECT 1 AS OrderId, 100 AS NegotiatedPrice, 110 AS SuggestedPrice UNION ALL
SELECT 2 AS OrderId, 1000 AS NegotiatedPrice, 50 AS SuggestedPrice
)
SELECT
o.OrderId,
(SELECT MAX(price)FROM
(SELECT o.NegotiatedPrice AS price
UNION ALL SELECT o.SuggestedPrice) d)
AS MaxPrice
FROM [Order] o
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册