7

我对 null 的使用有疑问。

如果我运行此查询

SELECT SUM(x)
FROM (SELECT NULL AS x) AS DerivedTable

我收到错误消息

“操作数数据类型 void 类型对 sum 运算符无效。”

但是,如果我创建一个带有可为空字段的表并在 sum 聚合中使用它,它将忽略 NULL 值并基本上将所有其余记录相加。

CREATE TABLE #temp1(x int)
insert into #temp values (NULL),(3),(5)

SELECT SUM(x) FROM #temp1 

结果是 8。

这个有逻辑上的解释吗?会不会是因为 NULL 的数据类型没有在派生表的查询中声明,而是在临时表中声明?另外,我真的很想知道在从表或派生表运行时是否有办法产生此错误消息,就像第二个 #temp1 示例一样。非常欢迎从表或表表达式运行时产生此错误消息的任何示例。

谢谢你们

4

1 回答 1

15

这确实是因为在您的派生表场景中 无法推断列的类型。

如果您更改语句并在列上显式使用类型,则选择将起作用。

SELECT SUM(x) FROM (SELECT CAST(NULL AS INTEGER) AS x) AS DerivedTable

与可以推断类型的以下语句一样

SELECT SUM(x) FROM (SELECT NULL AS x UNION SELECT 1) AS DerivedTable

SQL小提琴


这也将回答您的第二个问题。由于您无法在不声明类型的情况下创建表,因此无法生成会生成特定错误消息的语句。

于 2013-03-11T06:04:52.357 回答