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

这段代码工作正常:
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;

输出

fk          maxx
----------- -----------
1           NULL

有:

警告:聚合或其他SET操作消除了空值.

但是这段代码

select fk,max(a) maxx
    from (values(1,a)
    group by fk;

给出错误

Msg 8117,Level 16,State 1,Line 5
操作数数据类型NULL对于max运算符无效.

在这两种情况下,sql server从null和null计算max?不是吗?

解决方法

在第一种情况下,您隐式指定数据类型,即整数.这是从那时永远无法达到的推断.对于sql server来说,当时不会被执行的事实并不重要. In fact,sql server确定返回类型的方式:“result_expressions中的类型集合中最高的 precedence类型和可选的else_result_expression”.因此,在实际执行之前选择返回类型,从then和else返回的所有潜在数据类型中选择.换句话说,在sql server’实现’之前,有些语句不可能达到.

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

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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...