1

NULL値に関して私を驚かせた何かに出くわしたとき、私はOracleデータベースでプロシージャをデバッグしていました。次のクエリが非等価チェックに対してfalseを返す理由を誰かが説明できますか?

DECLARE
    vNullVariable VARCHAR2(2) := NULL;
    vVariable VARCHAR2(2) := 'Hi';
BEGIN
    IF vNullVariable <> vVariable THEN
        dbms_output.put_line( 'The variables are not equal' );
    ELSE
        dbms_output.put_line( 'The variables are equal' );
    END IF;
END;
4

3 に答える 3

8

これは、SQLが3値論理(3VL)を使用しているためです。TRUEがあり、FALSEがあり、NULLがあります(不明、 TRUEでもFALSEでもない)。

式の結果は、vNullVariable <> vVariablevNullVariableの値が不明であると見なされるため、3VLではTRUEではなくNULLになります。後で既知の値になる場合は、「Hi」になる場合とそうでない場合がありますが、現在はSQLです。わからないので、NULL(不明)を返します。

したがって、IF式はTRUEではなくNULLと評価され、代わりにデフォルトのELSEパスが使用されます。これは、IFのロジックが次の場合であるためです。

IF <expression is true> THEN
   ...
ELSE -- ie. if expression is FALSE or NULL
   ...
END IF;

これは、チェックを逆に書いた場合に期待した動作が得られることを意味します。

IF vNullVariable = vVariable THEN
    dbms_output.put_line( 'The variables are equal' );
ELSE
    dbms_output.put_line( 'The variables are not equal' );
END IF;
于 2012-09-13T11:45:03.170 に答える
2

NULLは、Oracleで奇妙な動作をします。nullと何かを比較するには、'=NULL'の代わりにISNULLを使用することをお勧めします

ここにあなたはについての良い説明があります

コードでは、次を使用できます

IF vVariable IS NOT NULL THEN
于 2012-09-13T11:46:33.590 に答える
1

Oracleでは、NULLはNULLと等しくも等しくもありません。2つのNULLを評価する比較条件は、常にFALSEになります。NULLを含む次の条件が有効になります。

1. IF vNullVariable is NULL THEN
2. IF vNullVariable is not NULL THEN
3. IF NVL(vNullVariable, -1) <> NVL(vVariable, -1) THEN -
    This condition will give you expected result even if both vNullVariabl 
    and vVariable are NULLs
4. Oracle considers two nulls to be equal when evaluating a DECODE function

たとえば、次のクエリは、DECODE関数の最初と2番目の引数が次の場合に1を返します。NULLs

    select decode(null, null, 1) res
      from dual;

 res
-------
  1
于 2012-09-13T12:00:29.970 に答える