Sql 将IIF函数嵌套在MAX函数中
我的任务是分析一个T-SQL函数,该函数在MAX函数中重复嵌套IIF函数。我是否遗漏了什么,或者这根本不会改变输出Sql 将IIF函数嵌套在MAX函数中,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的任务是分析一个T-SQL函数,该函数在MAX函数中重复嵌套IIF函数。我是否遗漏了什么,或者这根本不会改变输出 DECLARE @firstVal INT = 1; SELECT [NotWrappedIff] = IIF(1=2, @firstVal, NULL) SELECT [MaxWrappedIff] = MAX(IIF(1=2, @firstVal, NULL)) 实际代码中有一个额外的isnull和嵌套的dateadd函数,但结构是相同的。嵌套IIF的假值均为空。实际代码:
DECLARE @firstVal INT = 1;
SELECT [NotWrappedIff] = IIF(1=2, @firstVal, NULL)
SELECT [MaxWrappedIff] = MAX(IIF(1=2, @firstVal, NULL))
实际代码中有一个额外的isnull和嵌套的dateadd函数,但结构是相同的。嵌套IIF的假值均为空。实际代码:
SomeIdToKeep = max(iif(isnull(SomeStartTime, SomeOtherStartTime) < @parmStartTime and dateadd(hour, HourIntVal, isnull(SomeStartTime, SomeOtherStartTime)) >= @parmStartTime, SomeId, null))
SomeIdToKeep=max(iif(isnull(SomeStartTime,SomeOtherStartTime)<@parmStartTime和dateadd(hour,HourIntVal,isnull(SomeStartTime,SomeOtherStartTime))>=@parmStartTime,SomeId,null))
您的示例过于简化,这就是它没有意义的原因
代码本身执行条件聚合,即它返回满足由IIF
确定的条件的行中的MAX
值
这可以通过以下方式证明:
declare @Test table (id int, StartDate date, [Value] int);
insert into @Test (id, StartDate, [Value])
values
(1, '01-Feb-2021', 10),
(2, '02-Feb-2021', 20),
(3, '03-Feb-2021', 30);
select
max([Value]) TrueMax
, max(iif(StartDate < '03-Feb-2021', [Value], null)) ConditionalMax
from @Test;
declare@testtable(id int,StartDate date,[Value]int);
插入@Test(id,StartDate,[Value])
价值观
(1,'01-Feb-2021',10),
(2,'02-Feb-2021',20),
(3,'03-Feb-2021',30);
选择
最大值([值])TrueMax
,最大值(iif(起始日期<'03-Feb-2021',[Value],null])条件最大值
来自@Test;
返回:
特鲁马克斯
条件性
30
20
假设您的实际查询在某个地方有一个
GROUP BY
,因此MAX
不是多余的。您的示例代码和实际代码似乎非常不同。没有样本数据很难评论。谢谢,@JeroenMostert函数中不存在GROUP BY。。。奇怪。@DaleK我试图拉出复杂嵌套的外部结构,以隔离有关MAX的问题(忽略isnull和dateadd计算)。我提供了用于上下文的实际代码。我认为为了理解代码,您将其过于简化了。在某些条件下,原始代码似乎是在忽略其他值的同时查找某些值的最大值。但是,如果没有看到数据与条件进行比较,就很难猜测逻辑。不过,在回答您的问题时,我相当肯定IIF
会导致在MAX
计算中忽略某些值。