1. ホーム
  2. sql

[解決済み】Oracle NVLとCoalesceの違いについて

2022-04-07 01:01:44

質問

OracleのNVLとCoalesceの間に明らかな違いはありますか?

明らかな違いは、coalesceはパラメータ・リストの最初の非NULL項目を返すのに対し、nvlは2つのパラメータを取り、それがNULLでなければ最初のパラメータを返し、そうでなければ2番目のパラメータを返すことです。

NVLはcoalesceのベースケースに過ぎないようです。

何か見落としているのでしょうか?

解決方法は?

COALESCE の一部であり、より現代的な機能です。 ANSI-92 を標準装備しています。

NVLOracle で紹介された、特定の 80 'sが標準化される以前のことです。

2つの値がある場合、それらは同義語である。

ただし、実装は異なる。

NVL は常に両方の引数を評価するのに対し COALESCE は、通常、最初の非 NULL (例外もあります。 NEXTVAL ):

SELECT  SUM(val)
FROM    (
        SELECT  NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
        FROM    dual
        CONNECT BY
                level <= 10000
        )

これは、ほぼ 0.5 を生成するため、数秒かかります。 SYS_GUID() の、にもかかわらず 1 ではない NULL .

SELECT  SUM(val)
FROM    (
        SELECT  COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
        FROM    dual
        CONNECT BY
                level <= 10000
        )

これは、次のように理解します。 1NULL であり、第2引数を評価しない。

SYS_GUID は生成されず、クエリーは即座に終了します。