首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获得警告: Null值由聚合或其他设置操作消除。

获得警告: Null值由聚合或其他设置操作消除。
EN

Stack Overflow用户
提问于 2013-09-10 12:50:50
回答 4查看 106.9K关注 0票数 41

我有这个模式

代码语言:javascript
运行
复制
create table t(id int, d date) 

insert into t (id, d) values (1, getdate()), 
                             (2, NULL)

做的时候

代码语言:javascript
运行
复制
declare @mindate date    
select @mindate = min(d) from t

我收到警告了

空值由聚合或其他集操作消除。

为什么我能做些什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-10 13:09:08

大多数情况下你不应该做任何事。

  • 可以通过设置ansi_warnings关闭警告,但这有其他影响,例如,如何处理零除法,当查询使用索引视图、计算列或XML方法等功能时,可能会导致失败。
  • 在某些有限的情况下,您可以重写聚合以避免它。例如,可以将COUNT(nullable_column)重写为SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END),但这并不总是能够在不更改语义的情况下直接完成。

它只是一条信息消息SQL标准中要求的。除了在消息流中添加不必要的噪声之外,它没有任何不良影响(除了Server不能绕过读取NULL行之外,后者可以具有头顶,但禁用警告在这方面不能给出更好的执行计划)

返回此消息的原因是在SQL中的大多数操作中传播。

SELECT NULL + 3 + 7返回NULL (将NULL视为未知数量,这是有意义的,因为? + 3 + 7也是未知的)

代码语言:javascript
运行
复制
SELECT SUM(N)
FROM   (VALUES (NULL),
               (3),
               (7)) V(N) 

返回10和忽略空值的警告。

但是,这些都是,这正是典型聚合查询所需的语义。否则,单个NULL的存在将意味着该列对所有行的聚合最终都会产生NULL,这不是很有用。

是下面最重的蛋糕? (像源创意共享图像被我修改(裁剪和注释))

在第三个蛋糕称好之后,天平断了,所以没有关于第四个蛋糕的信息,但是仍然有可能测量圆周。

代码语言:javascript
运行
复制
+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
|      1 | 50     | 12.0          |
|      2 | 80     | 14.2          |
|      3 | 70     | 13.7          |
|      4 | NULL   | 13.4          |
+--------+--------+---------------+

查询

代码语言:javascript
运行
复制
SELECT MAX(Weight)        AS MaxWeight,
       AVG(Circumference) AS AvgCircumference
FROM   Cakes 

返回

代码语言:javascript
运行
复制
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|        80 |          13.325  |
+-----------+------------------+

即使从技术上讲,不能肯定地说80是最重蛋糕的重量(因为未知的数目可能更大),上述结果通常比简单地返回未知的结果更有用。

代码语言:javascript
运行
复制
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|         ? |          13.325  |
+-----------+------------------+

因此,您很可能希望NULLs被忽略,而警告只是提醒您这一事实正在发生。

票数 126
EN

Stack Overflow用户

发布于 2013-09-10 13:17:26

我认为在这种情况下您可以忽略这个警告,因为您使用了MIN函数。

“除计数外,聚合函数忽略空值”

请参阅聚合函数(Transact-SQL)

票数 3
EN

Stack Overflow用户

发布于 2013-09-10 12:50:50

在您的情况下,min()应该作为d的最低值返回什么?

该错误通知您,min()函数没有考虑到null记录。

因此,如果它应该忽略NULL值并返回最低的现有日期,那么您可以忽略此警告。

如果您还喜欢为这条语句取消警告,那么您可以这样做

代码语言:javascript
运行
复制
set ansi_warnings off
select @mindate = min(d) from t
set ansi_warnings on

如果您希望通过使用默认值来考虑NULL值,那么您可以设置一个默认值,如下所示

代码语言:javascript
运行
复制
select @mindate = min(isnull(d, cast(0 as datetime)))
from t
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18719436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档