我有这个架构
create table t(id int, d date)
insert into t (id, d) values (1, getdate()),
(2, NULL)
Run Code Online (Sandbox Code Playgroud)
做的时候
declare @mindate date
select @mindate = min(d) from t
Run Code Online (Sandbox Code Playgroud)
我收到了警告
通过聚合或其他SET操作消除空值
为什么以及我该怎么办呢?
Mar*_*ith 94
你也可以什么都不做.
它只是SQL标准中所需的信息性消息.它没有任何不良影响.
返回此消息的原因是,在SQL空值传播的大多数操作中.
SELECT NULL + 3 + 7返回NULL(NULL作为未知数量,这是有意义的,因为? + 3 + 7也是未知的)
但
SELECT SUM(N)
FROM (VALUES (NULL),
(3),
(7)) V(N)
Run Code Online (Sandbox Code Playgroud)
返回10以及忽略null的警告.
但是,这些正是您对典型聚合查询所需的语义.否则,单个的存在NULL意味着在所有行上的该列上的聚合总是最终产生NULL,这不是非常有用.
哪个是下面最重的蛋糕?(图片来源,知识共享图片由我改变(裁剪和注释))
在第三块蛋糕称重后,秤破裂,因此没有关于第四块的信息,但仍然可以测量周长.
+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
| 1 | 50 | 12.0 |
| 2 | 80 | 14.2 |
| 3 | 70 | 13.7 |
| 4 | NULL | 13.4 |
+--------+--------+---------------+
Run Code Online (Sandbox Code Playgroud)
查询
SELECT MAX(Weight) AS MaxWeight,
AVG(Circumference) AS AvgCircumference
FROM Cakes
Run Code Online (Sandbox Code Playgroud)
返回
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| 80 | 13.325 |
+-----------+------------------+
Run Code Online (Sandbox Code Playgroud)
即使从技术上讲,也不可能肯定地说80是最重的蛋糕的重量(因为未知的数字可能更大),上述结果通常比简单地返回未知数更有用.
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| ? | 13.325 |
+-----------+------------------+
Run Code Online (Sandbox Code Playgroud)
因此,您可能希望忽略NULL,并且警告只会提醒您发生这种情况.
| 归档时间: |
|
| 查看次数: |
83640 次 |
| 最近记录: |