Eva*_*oll 30 sql-server feature-comparison t-sql
回顾这个问题,似乎不需要做很多工作。他们试图用日期扩展范围。在其他数据库中,您只需使用greatest
和least
..
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 用户如何实现查询模式来模仿least
和greatest
功能。
GREATEST
/LEAST
GREATEST
/LEAST
GREATEST
LEAST
GREATEST
LEAST
GREATEST
LEAST
您是否将条件展开到CASE
语句中,或者是否存在启用此功能的 Microsoft 的扩展、第三方加载项或许可?
Eri*_*ing 36
一种常用的方法是使用VALUES
子句,CROSS APPLY
将两列别名为一列,然后得到每列的MIN
和MAX
。
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)
仅供参考,我们在 Azure SQL DB 和即将推出的 SQL Server 版本中实现了 GREATEST 和 LEAST:
小智 7
最低等价物:
IIF(@a < @b, @a, @b)
Run Code Online (Sandbox Code Playgroud)
最大的等价物:
IIF(@a > @b, @a, @b)
Run Code Online (Sandbox Code Playgroud)