gpt4 book ai didi

sql - 为什么 NULL 在聚合函数和标量函数中的处理方式不同?

转载 作者:行者123 更新时间:2023-12-03 07:54:19 25 4
gpt4 key购买 nike

让我们进行以下两个查询:

select greatest(1, val) from unnest([null]) as val
# null

还有:

select sum(val) from unnest([1, null]) as val
# 1

我的问题是为什么聚合函数和普通标量函数对 null 的处理方式不同?当然,当 null 值不被计算在内时,第二个查询更有用。但我认为如果第一个返回 1 而不是 null 也会更有用。如果 null 是一个“未知值”,那么这两个函数不是都会有一个未知的答案(即 null),而不仅仅是后者吗?

如果这有历史原因,那么也很高兴知道。希望有人能够阐明为什么两者之间存在差异。

最佳答案

聚合函数应该跳过空值。以下是 SQL-92 标准的摘录:

<set function specification>

[...]

Otherwise, let TX be the single-column table that is the result ofapplying the <value expression> to each row of T and eliminatingnull values. If one or more null values are eliminated, then acompletion condition is raised: warning- null value eliminated in setfunction.

另一方面,如果任何参数为 null,则 greatest 函数应返回 null。

My question is why is null handled differently between aggregatefunctions and normal scalar functions?

一般来说,如果标量函数的任何参数为 null²,则标量函数将返回 null。这是Ask Tom's take on this exact same issue ,我个人同意答案中所说的一切:

and Tom said...

pretty much all single row functions return NULL if any of theirinputs to compare are null.

ops$tkyte%ORA10GR2> select round( 1.2, null ) from dual;

ROUND(1.2,NULL)
---------------
NULL

when you ask "what is the greatest of 1, NULL, 2 - the answer is "wedon't know, because NULL is unknown"

Aggregates are defined to "skip nulls" (ANSI says so)

But functions in general that take a set of inputs, will return NULLwhen a deciding input is NULL.

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#i88893

If you call a SQL function with a null argument, then the SQL functionautomatically returns null

1 最伟大的函数在标准化之前很久就存在不同的实现。 MySQLOracle如果任何参数为 null,则返回 null;而PostgreSQLSQL Server忽略空值。

² 相反,存在跳过空值的供应商特定标量函数。一个示例是 concat_ws(MySQL、PostgreSQL、SQL Server)函数,该函数旨在简化使用分隔符的字符串(可能为空)的串联。

关于sql - 为什么 NULL 在聚合函数和标量函数中的处理方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76443564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com