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

标签 sql sql-server tsql

这段代码工作正常:

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 都会根据 nullnull 计算 max?不是吗?

最佳答案

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

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

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

关于sql - 操作数数据类型 NULL 对于 max 运算符无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922073/

相关文章:

sql - 如何从另一个表中获取第一个表的行数?

sql - 在 SQL 中查询 JSON

java - 如何在 SQLite 中向表添加外键?

c# - 运行时 EF6(mssql、mysql、oracle)的多个数据库提供程序的 Entity Framework 代码的动态连接字符串优先

c# - Sql查询与Linq数据查询性能对比

c# - SQL 查询在代码中超时,但在管理工作室中需要几秒钟

sql-server - 避免在 WHERE 子句中引用表两次

sql-server-2008 - tsql DATEDIFF 在几分钟内调用而不舍入秒数

php - 使用 SQL SELECT 查询返回最小用户数

mysql - Min, MAX SQL 查询优化