2009-11-19 79 views
10

我发现SQL的这个片段在视图中,我颇为不解通过它的目的(实际的SQL缩短为简洁起见):COALESCE用NULL

SELECT 
    COALESCE(b.Foo, NULL) AS Foo 

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

我想不出的合并的目的,理由只有一个与空,而不是仅仅这样做:

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合并,而不是直接选择列?我忍不住笑,把它当作菜鸟的错误写下来,但这让我怀疑是否有一些我不知道的“边缘情况”。

+2

看起来像一个新人的错误给我。 – 2009-11-19 22:15:57

+4

或者需求已经多次改变,所以这个查询被不同的开发者多次修改。也许COALESCE(b.Foo,NULL)是COALESCE(b.Foo,[某值/表达式])之前。然后要求变了。所以有人没有想到就变成了COALESCE(b.Foo,NULL)。 – David 2009-11-19 22:19:41

+0

如果b.Foo为NULL,这可能是触发错误的方法。是否有效是另一个问题。 – Mike 2016-09-02 19:33:17

回答

11

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

SELECT COALESCE(b.Foo, NULL) 

...因为如果b.foo为NULL,你可能也只是使用:

SELECT b.foo 

...假设你想要知道值是否为空。

4

我认为那里可能是一个边缘情况,但它是非常具有历史意义的 - 这是一个猜测,但它可以包围b.foo =''例如一串空格。在SQL和LTrim('')返回空(6/6.5)回到足够远,所以我想知道空字符串上的Coalesce是否也评估它为null,如果它确实然后机制被用于只能将空格字符串转换为空值? (如果所有值均为空值,Coalesce将返回空值。)

这是一个猜测,我不能马上测试,但不应该很难检查。