COALESCE与NULL

时间:2009-11-19 22:05:55

标签: sql sql-server tsql coalesce

我在视图中发现了这段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结合而不是直接选择列?我忍不住笑了,把它作为一个新手的错误写下来但它让我想知道是否有一些我不知道的“边缘案例”。

3 个答案:

答案 0 :(得分:11)

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

SELECT COALESCE(b.Foo, NULL)

...因为如果b.foo为NULL,您可以使用:

SELECT b.foo

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

答案 1 :(得分:4)

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

在SQL中返回足够远,LTrim('')返回null(6 / 6.5),所以我想知道空字符串上的Coalesce是否也将它评估为null,如果确实如此,那么机制被用来转只有空格字符串,为空值? (如果所有值都计算为null,则Coalesce将返回Null。)

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

答案 2 :(得分: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