在关系代数中转换 NULL
Converting NULLs in relational algebra
由于外连接,我有一个 table,我想对一个属性求和,但该属性中的某些元组为 NULL。如何将 NULL 转换为适当的值(在本例中为 0)?
我正在阅读的这本书并没有过多地讨论关系代数中的 NULL 类型,所以我假设聚合函数不会尝试执行 "right thing" 和将 null 解释为单位。
在关系数据模型中,NULL
值不是普通值,不会根据不同的运算符转换为任何特定值。
SUM 与其他聚合运算符一样,忽略 NULL 值,因此实际上对具有空值的列求和相当于对所有非空值求和,这显然相当于对待 NULL
为 0
。同样,如果您尝试计算数字列的平均值,则只会对非空值求和,然后将总数除以非空值的数量(不是所有值)。
另一方面,如果您想以特殊方式考虑空值以进行某些操作,您可以检查它并将其替换为您感兴趣的值。
例如,以下 SQL 查询计算 column
的非空值的 AVG
:
SELECT AVG(column)
FROM table
而下一个计算 AVG
将 NULL
值视为 0
(因此给出与前一个不同的结果):
SELECT AVG(CASE WHEN column IS NULL THEN 0 ELSE column END)
FROM table
您可以使用MySql的IFNULL()功能:
SELECT
AVG(IFNULL(possibleNullValue, 0))
FROM
table
IFNULL()
将检查表达式 1 是否为空,如果是,则将您提供的值作为第二个表达式 - 在本例中为 0
.
如果您不使用 mysql,请参阅其他数据库引擎的等效项 here
好的,我解决了。诀窍是使用扩展投影运算符以及 selection 和 union。
在我的特殊情况下,我们想将空值转换为 0,我们开始:
假设关系 R
R - select(q = null, R) 联合项目(pn, 0 -> q, select(q = null, R))
在并集的 LHS 上,我们从 R 中删除所有出现的 q = null。
在 RHS 上,我们采用所有 q = null 的元组并将它们投影为 pn 并且所有 q 列值均为 0.
bag 语义中的 union 可以认为是加号。
由于外连接,我有一个 table,我想对一个属性求和,但该属性中的某些元组为 NULL。如何将 NULL 转换为适当的值(在本例中为 0)?
我正在阅读的这本书并没有过多地讨论关系代数中的 NULL 类型,所以我假设聚合函数不会尝试执行 "right thing" 和将 null 解释为单位。
在关系数据模型中,NULL
值不是普通值,不会根据不同的运算符转换为任何特定值。
SUM 与其他聚合运算符一样,忽略 NULL 值,因此实际上对具有空值的列求和相当于对所有非空值求和,这显然相当于对待 NULL
为 0
。同样,如果您尝试计算数字列的平均值,则只会对非空值求和,然后将总数除以非空值的数量(不是所有值)。
另一方面,如果您想以特殊方式考虑空值以进行某些操作,您可以检查它并将其替换为您感兴趣的值。
例如,以下 SQL 查询计算 column
的非空值的 AVG
:
SELECT AVG(column)
FROM table
而下一个计算 AVG
将 NULL
值视为 0
(因此给出与前一个不同的结果):
SELECT AVG(CASE WHEN column IS NULL THEN 0 ELSE column END)
FROM table
您可以使用MySql的IFNULL()功能:
SELECT
AVG(IFNULL(possibleNullValue, 0))
FROM
table
IFNULL()
将检查表达式 1 是否为空,如果是,则将您提供的值作为第二个表达式 - 在本例中为 0
.
如果您不使用 mysql,请参阅其他数据库引擎的等效项 here
好的,我解决了。诀窍是使用扩展投影运算符以及 selection 和 union。
在我的特殊情况下,我们想将空值转换为 0,我们开始:
假设关系 R
R - select(q = null, R) 联合项目(pn, 0 -> q, select(q = null, R))
在并集的 LHS 上,我们从 R 中删除所有出现的 q = null。 在 RHS 上,我们采用所有 q = null 的元组并将它们投影为 pn 并且所有 q 列值均为 0.
bag 语义中的 union 可以认为是加号。