代码之家  ›  专栏  ›  技术社区  ›  Colin Burnett

合并为空

  •  10
  • Colin Burnett  · 技术社区  · 15 年前

    我在一个视图中发现了这段SQL代码,我对它的用途感到非常困惑(实际的SQL简称为简洁):

    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
    

    或者至少不要显式地包含空值:

    SELECT
        COALESCE(b.Foo) AS Foo
    
    FROM a
    LEFT JOIN b ON b.aId=a.Id
    

    我不知道这是谁写的(所以我不能问),它是什么时候写的,或者它是为什么特定的MS SQL Server版本写的(当然是2008年以前的版本)。

    是否有任何有效的理由可以合并为空而不是直接选择列? 我忍不住笑了起来,把它作为一个新手的错误写了下来,但这让我想知道是否有一些“边缘案例”我不知道。

    3 回复  |  直到 6 年前
        1
  •  11
  •   OMG Ponies    15 年前

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

    SELECT COALESCE(b.Foo, NULL)
    

    因为……如果 b.foo 为空,您还可以使用:

    SELECT b.foo
    

    …假设你 希望 知道值是否为空。

        2
  •  4
  •   Andrew    15 年前

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

    回到SQL中,LTRIM(“”)返回了空值(6/6.5),所以我想知道合并空字符串是否也将其计算为空值,如果是这样,那么该机制是否被用于将空字符串转换为空值?(如果所有值的计算结果都为空,则coalesce将返回空值。)

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

        3
  •  0
  •   Galal Ouda    6 年前

    如果我有多个列要检查它们是否都是空的,我将使用它,而不是对每一列使用并且不是空的,我可以使用一个合并,它将使代码更简单和更可读,例如

    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