11

我在一个视图中找到了这段 SQL 片段,我对它的目的感到很困惑(为简洁起见,实际的 SQL 被缩短了):

SELECT
    COALESCE(b.Foo, NULL) AS Foo

FROM a
LEFT JOIN b ON b.aId=a.Id

我想不出与 null 合并的目的的单一原因,而不仅仅是这样做:

SELECT
    b.Foo AS Foo

FROM a
LEFT JOIN b ON b.aId=a.Id

或者至少不要明确包含 NULL :

SELECT
    COALESCE(b.Foo) AS Foo

FROM a
LEFT JOIN b ON b.aId=a.Id

我不知道这是谁创作的(所以我不能问),它是什么时候创作的,或者它是为哪个特定的 MS SQL Server 版本编写的(不过肯定是 2008 年之前的版本)。

是否有任何正当理由与 NULL 合并而不是直接选择列? 我忍不住笑了起来,把它写成一个菜鸟的错误,但这让我想知道是否有一些我不知道的“边缘案例”。

4

3 回答 3

12

你是对的 - 没有理由使用:

SELECT COALESCE(b.Foo, NULL)

...因为如果b.foo是 NULL,你不妨只使用:

SELECT b.foo

...假设您知道该值是否为空。

于 2009-11-19T22:09:19.620 回答
4

我认为可能存在边缘情况,但它具有历史意义 - 这有点猜测,但它可能围绕 b.foo = ' ' 的情况,例如一串空格。

在 SQL 中回溯到足够远,并且 LTrim('') 返回 null (6 / 6.5),所以我想知道空字符串上的 Coalesce 是否也将其评估为 null,如果确实如此,那么该机制被用于转换空格字符串只有,变成空值?(如果所有值都评估为 null,Coalesce 将返回 Null。)

这是一个猜测,我无法立即对其进行测试,但应该不难检查。

于 2009-11-20T02:20:47.617 回答
0

如果我有多个列,我想检查它们是否都为空,我会使用它,而不是对每一列使用 AND 和 IS NOT NULL,我可以使用单个 COALESCE,这将使代码更简单且更具可读性, 例如

Select t.a, t.b, t.c, t.d, t.e
from table t
where coalesce(t.a, t.b, t.c, t.d, t.e) is [not] null
于 2018-07-12T08:40:21.293 回答