SQL Server 2008中的函数类似于MySQL中的GREATEST?

我想find多个列的最大值。

MySQL支持GREATEST函数,但SQL Server不支持。

在SQL Server 2008中是否有类似这样的function?

但是,子查询可以访问外部查询中的列,因此您可以添加子查询UNION ALL将感兴趣的列作为派生表,然后从中selectmax

 SELECT *, (SELECT MAX(c) FROM (SELECT number AS c UNION ALL SELECT status) T) AS GreatestNumberOrStatus FROM master..spt_values 

或者更像2008年的简洁版本。

 SELECT *, (SELECT MAX(c) FROM (VALUES(number),(status)) T (c)) AS Greatest FROM master..spt_values 

为此,我创build了一个标量函数,如下所示:

 CREATE FUNCTION [dbo].[MaxOrNull](@val1 int, @val2 int) returns int as begin if @val1 >= @val2 RETURN @val1 if @val1 < @val2 RETURN @val2 RETURN NULL end 

这是最优雅的解决scheme,可以在SQL代码中的任何地方使用。

我会推荐以下解决scheme:

 SELECT (CASE WHEN t.createdt < t.changedt THEN t.changedt ELSE t.created END) AS ChgDate FROM table t 

尝试使用TOP而不是MAX

您可以在子查询中使用MAX

可能的解决scheme:

 Create FUNCTION [dbo].[MaxOf] ( @val1 INT =0, @val2 INT=0 , @val3 INT =0, @val4 INT =0, @val5 INT =0, @val6 INT =0, @val7 INT =0, @val8 INT =0, @val9 INT =0, @val10 INT =0, @val11 INT =0, @val12 INT =0, @val13 INT =0, @val14 INT =0, @val15 INT =0, @val16 INT =0, @val17 INT =0, @val18 INT =0, @val19 INT =0, @val20 INT =0) --OUTPUT RETURNS INT WITH SCHEMABINDING AS BEGIN DECLARE @MAX AS INT ; SET @MAX=0 IF isnull(@val1,0)> isnull(@MAX,0) SET @MAX=isnull(@val1,0) IF isnull(@val2,0)> isnull(@MAX,0) SET @MAX=isnull(@val2,0) IF isnull(@val3,0)> isnull(@MAX,0) SET @MAX=isnull(@val3,0) IF isnull(@val4,0)> isnull(@MAX,0) SET @MAX=isnull(@val4,0) IF isnull(@val5,0)> isnull(@MAX,0) SET @MAX=isnull(@val5,0) IF isnull(@val6,0)> isnull(@MAX,0) SET @MAX=isnull(@val6,0) IF isnull(@val7,0)> isnull(@MAX,0) SET @MAX=isnull(@val7,0) IF isnull(@val8,0)> isnull(@MAX,0) SET @MAX=isnull(@val8,0) IF isnull(@val9,0)> isnull(@MAX,0) SET @MAX=isnull(@val9,0) IF isnull(@val10,0)> isnull(@MAX,0) SET @MAX=isnull(@val10,0) IF isnull(@val11,0)> isnull(@MAX,0) SET @MAX=isnull(@val11,0) IF isnull(@val12,0)> isnull(@MAX,0) SET @MAX=isnull(@val12,0) IF isnull(@val13,0)> isnull(@MAX,0) SET @MAX=isnull(@val13,0) IF isnull(@val14,0)> isnull(@MAX,0) SET @MAX=isnull(@val14,0) IF isnull(@val15,0)> isnull(@MAX,0) SET @MAX=isnull(@val15,0) IF isnull(@val16,0)> isnull(@MAX,0) SET @MAX=isnull(@val16,0) IF isnull(@val17,0)> isnull(@MAX,0) SET @MAX=isnull(@val17,0) IF isnull(@val18,0)> isnull(@MAX,0) SET @MAX=isnull(@val18,0) IF isnull(@val19,0)> isnull(@MAX,0) SET @MAX=isnull(@val19,0) IF isnull(@val20,0)> isnull(@MAX,0) SET @MAX=isnull(@val20,0) RETURN @MAX ; END 

和电话会

 SELECT dbo.MaxOf (2,3,4,0,0,0,0,200,8,0,0,0,0,0,0,0,0,0,0,0)