操作数数据类型NULL对于max运算符无效

Rus*_* K. 7 sql t-sql sql-server

这段代码工作正常:

select fk, max(case when 1 = 0 then 1 else null end) maxx
    from (values(1, null), (1, null)) x(fk, a) 
    group by fk;
Run Code Online (Sandbox Code Playgroud)

输出:

fk          maxx
----------- -----------
1           NULL
Run Code Online (Sandbox Code Playgroud)

有:

Warning: Null value is eliminated by an aggregate or other SET operation.

但是这段代码:

select fk, max(a) maxx
    from (values(1, null), (1, null)) x(fk, a)
    group by fk;
Run Code Online (Sandbox Code Playgroud)

给出错误:

Msg 8117, Level 16, State 1, Line 5 Operand data type NULL is invalid for max operator.

在这两种情况下sql server计算maxnullnull?不是吗?

Hon*_*ger 9

在第一种情况下,您隐式指定数据类型,即整数.这是从then永远不会达到的推断.该事实then将不会被执行,也无所谓的SQL Server.实际上,sql server确定返回类型的方式是:" result_expressions中类型集中的最高优先级类型和可选的else_result_expression ".因此,返回类型是实际执行之前选择的,从和中返回的所有潜在数据类型中选择.换句话说,在sql server'实现'之前,无法达到某些语句.thenelse

由于数据类型是已知的,max因此可以应用.

在第二种情况下,您没有指定数据类型,因此sql server无法知道如何实现max.一个max用于varchar比不同max的整数.