SQL Server 是否支持 GREATEST 和 LEAST,如果不支持,常见的解决方法是什么?

Eva*_*oll 30 sql-server feature-comparison t-sql

回顾这个问题,似乎不需要做很多工作。他们试图用日期扩展范围。在其他数据库中,您只需使用greatestleast..

least(extendDate,min), greatest(extendDate,max)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这些时,我得到

'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.
Run Code Online (Sandbox Code Playgroud)

这将涵盖任一方向的扩展。

就问题而言,您仍然需要进行排他性范围替换。

我只是想知道 SQL Server 用户如何实现查询模式来模仿leastgreatest功能。

您是否将条件展开到CASE语句中,或者是否存在启用此功能的 Microsoft 的扩展、第三方加载项或许可?

Eri*_*ing 36

一种常用的方法是使用VALUES子句,CROSS APPLY将两列别名为一列,然后得到每列的MINMAX

SELECT MIN(x.CombinedDate) AS least, MAX(x.CombinedDate) AS greatest
FROM   dbo.Users AS u
CROSS APPLY ( VALUES ( u.CreationDate ), ( u.LastAccessDate )) AS x ( CombinedDate );
Run Code Online (Sandbox Code Playgroud)

还有其他的写法,例如使用 UNION ALL

SELECT MIN(x.CombinedDate) AS least, MAX(x.CombinedDate) AS greatest
FROM   dbo.Users AS u
CROSS APPLY ( SELECT u.CreationDate UNION ALL SELECT u.LastAccessDate ) AS x(CombinedDate);
Run Code Online (Sandbox Code Playgroud)

但是,生成的查询计划似乎是相同的。


Dav*_*oft 21

您还可以将值内联放在子查询中。像这样:

select (select max(i) from (values (1), (2), (5), (1), (6)) AS T(i)) greatest,
       (select min(i) from (values (1), (2), (5), (1), (6)) AS T(i)) least
Run Code Online (Sandbox Code Playgroud)


Con*_*SFT 9

仅供参考,我们在 Azure SQL DB 和即将推出的 SQL Server 版本中实现了 GREATEST 和 LEAST:

https://learn.microsoft.com/en-us/sql/t-sql/functions/tical-functions-greatest-transact-sql?view=sql-server-ver15


小智 7

最低等价物:

IIF(@a < @b, @a, @b)
Run Code Online (Sandbox Code Playgroud)

最大的等价物:

IIF(@a > @b, @a, @b)
Run Code Online (Sandbox Code Playgroud)

  • 您如何为三个或更多值执行此操作,例如`least(5,6,7,8,9)`? (3认同)
  • 这种方法很快就会变得难以阅读和验证……它的性能如何? (2认同)
  • 这不等于最小也不等于最大。 (2认同)

Dav*_*kle 6

GREATEST并且LEAST现在在 Azure SQL 中受支持,并将在 SQL Server 2019 之后的下一版本 SQL Server 中得到支持。(SQL Server 2021?)


小智 5

这将是一个好的开始——

CASE WHEN A > B THEN A ELSE B END
Run Code Online (Sandbox Code Playgroud)