这段代码工作正常:
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, null), (1, null)) x(fk, a)
group by fk;
给出错误:
消息 8117,级别 16,状态 1,第 5 行
操作数数据类型 NULL 对于 max 运算符无效。
在这两种情况下,sql server 都会根据 null
和 null
计算 max
?不是吗?
最佳答案
在第一种情况下,您隐式指定数据类型,即整数。这是从永远不会到达的 then
推断出来的。 then
不会被执行这一事实对于 sql server 来说并不重要。 In fact ,sql server 确定返回类型的方式:“result_expressions 和可选 else_result_expression 中类型集中的最高 precedence 类型”。因此,返回类型是在实际执行之前从 then
和 else
中返回的所有潜在数据类型中选择的。换句话说,在 sql server“意识到”某些语句不可能到达之前。
由于数据类型已知,因此可以应用max
。
在第二种情况下,您没有指定数据类型,因此sql server无法知道如何实现max
。 varchar
的 max
与整数的 max
不同。
关于sql - 操作数数据类型 NULL 对于 max 运算符无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922073/