【发布时间】:2011-01-18 15:22:41
【问题描述】:
【问题讨论】:
标签: sql sql-server sql-server-2008
【问题讨论】:
标签: sql sql-server sql-server-2008
SQL Server 2008 中没有,但这些函数 are/will be available finally in SQL Server(可能是 SQL Server 2022)
现在,GREATEST 和 LEAST T-SQL 函数在 Azure SQL 数据库以及 Azure Synapse Analytics(无服务器 仅限 SQL 池)和 Azure SQL 托管实例。
这些函数也将在即将发布的 SQL 版本中提供 服务器。
对于以前的版本,您可以使用子查询可以访问外部查询中的列的事实,以便您可以添加子查询从这些的联合中选择max。
SELECT *,
(SELECT MAX(c) FROM (VALUES(number),(status)) T (c)) AS Greatest
FROM master..spt_values
或者对于 SQL Server 2000/2005
SELECT *,
(SELECT MAX(c) FROM
(SELECT number AS c
UNION ALL
SELECT status) T) AS GreatestNumberOrStatus
FROM master..spt_values
【讨论】:
CASE 语句效率低。
为此,我创建了一个标量函数,如下所示:
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
这是最优雅的解决方案,可以在 SQL 代码的任何地方使用。
【讨论】:
GREATEST(col1,col2,col3,col4,col5,col6)?它不需要很多排列吗?编辑:实际上,您当然可以嵌套调用,在这种情况下,排列增长是您想要跨列排序的不同场景。
create function dbo.greater(@a int, @b int) returns int as begin return case when @a >= isnull(@b,@a) then @a else @b end end
我会推荐以下解决方案:
SELECT (CASE WHEN t.createdt < t.changedt THEN t.changedt ELSE t.created END) AS ChgDate
FROM table t
【讨论】:
一个可能的解决方案:
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)
【讨论】:
尝试改用TOP 或MAX。
【讨论】: