11

ビューでこのSQLのスニペットを見つけましたが、その目的にかなり戸惑っています(実際のSQLは簡潔にするために短縮されています)。

SELECT
    COALESCE(b.Foo, NULL) AS Foo

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

これを行うのではなく、nullと合体する目的の1つの理由を考えることはできません。

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

...値がnullかどうかを知りたいと仮定します。

于 2009-11-19T22:09:19.620 に答える
4

エッジケースがあるかもしれないと思いますが、それは非常に歴史的です-それは少し推測ですが、b.foo =''のような状況、たとえば一連のスペースを囲む可能性があります。

SQLで十分に戻ると、LTrim('')がnull(6 / 6.5)を返したので、空の文字列のCoalesceもnullと評価したかどうか疑問に思っています。評価した場合は、メカニズムを使用してスペースの文字列を変換していました。のみ、null値に?(すべての値がnullと評価された場合、CoalesceはNullを返します。)

これは推測であり、すぐにテストすることはできませんが、確認するのは難しいことではありません。

于 2009-11-20T02:20:47.617 に答える
0

複数の列があり、それらすべてがnullかどうかを確認したい場合は、すべての列で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 に答える