我有一个表作为外连接的结果,我想在一个属性上使用SUM,但是该属性中的一些元组是NULL。如何将NULL转换为适当的值(在本例中为0)?
我正在阅读的书并没有真正地关注关系代数中的NULL类型,所以我将假设聚合函数不会尝试做“正确的事情”并将null解释为单元。
答案 0 :(得分:1)
在关系数据模型中,NULL
值不是普通值,并且不会根据不同的运算符转换为任何特定值。
SUM,作为其他聚合运算符,忽略NULL值,因此实际上对具有空值的列求和相当于对所有非空值求和,这很可能等同于将NULL
视为0
。同样,如果您尝试计算数字列的平均值,则只计算非空值,而将总数除以非空值的数量(不是所有值)。
另一方面,如果您想以特殊方式考虑某个操作的空值,您可以检查它并将其替换为您感兴趣的值。
例如,以下SQL查询计算AVG
的非空值的column
:
SELECT AVG(column)
FROM table
而下一个计算AVG
时将NULL
值视为0
(因此给出的结果与前一个不同):
SELECT AVG(CASE WHEN column IS NULL THEN 0 ELSE column END)
FROM table
答案 1 :(得分:0)
您可以使用MySql' IFNULL()功能:
SELECT
AVG(IFNULL(possibleNullValue, 0))
FROM
table
IFNULL()
将检查表达式1是否为空,如果是,则将您提供的值作为第二个表达式 - 在本例中为0
。
如果您不使用mysql,请参阅其他数据库引擎的等价物here
答案 2 :(得分:0)
好吧,我解决了。诀窍是使用扩展投影运算符以及选择和并集。
在我的特定情况下,我们想将空值转换为0,我们在这里:
假设关系R
R - 选择(q = null,R)联合项目(pn,0 - > q,select(q = null,R))
在联合的LHS上,我们从R中删除所有出现的q = null。 在RHS上,我们获取q = null的所有元组,并将它们作为pn投影,所有q列值都为0.
袋子语义中的联合可以被认为是加号。