変更の開始

NULL値を確認する方法

列値を取り出す前に、その列値がヌルかどうかを判別できます。

アプリケーションは、多くの場合、 2 つの値が等しいか等しくないかを確認する必要があります。 基本述部を使って、等しいか、等しくないかの比較ができます。 等しいか、等しくない比較では、true、false、またはunknownを返すことができます。 DISTINCT述部を除いて、SQLの通常の規則は、あるNULL値が別のNULL値と等しくなることは決してないということです。 基本述部の一方または両方のオペランドがNULL値である場合、結果は不明です。

アプリケーションによっては、列にNULL値を含めたり除外したりすることができます。 これを行うには、NULL述語を使用できます。

MY_EMPは、会社の各従業員の姓と電話番号を持つ表です。 この会社では、電話番号を共有する従業員はいませんが、電話番号を持っていない従業員もいます。 LASTNAME 列には、各従業員の姓が含まれています。 PHONENO 列には、各従業員の電話番号が含まれています。 従業員が電話を持たない場合、 PHONENO 列の値は NULLになります。 この表は、次のようになります。

LASTNAME PHONENO
HAAS -------
THOMPSON 3476
KWAN 4738
GEYER 6789
STERN 6423

電話番号を持たない従業員の姓を知りたいとします。 PHONENO 列の値が NULLの場合、 WHERE節は NULL 列の値を NULL のホスト変数値と比較するため、このようなクエリで機能しません。 その比較結果は不明です。


MOVE -1 TO PHONENO-IND. 
EXEC SQL
 SELECT LASTNAME
  INTO :LASTNAME-HV
  FROM MY_EMP
  WHERE PHONENO = :PHONENO-HV :PHONENO-IND 
END-EXEC.

電話番号にNULL値を持つ従業員を見つけるには、NULL述語を使用する必要があります。

EXEC SQL
 SELECT LASTNAME
  INTO :LASTNAME-HV
  FROM MY_EMP
  WHERE PHONENO IS NULL 
END-EXEC.

SELECTステートメントは 'HAAS'のLASTNAME値を返します。

ここで、電話番号が特定の値と一致するか、電話番号がNULLである従業員の姓を選択するとします。 これを行うには、2つの検索条件をコーディングする必要があります。1つは電話番号がNULLでない場合を処理するためのもので、もう1つは電話番号がNULLである場合を処理するためのものです。 SELECT ステートメントは、次のようになります。

EXEC SQL
  SELECT LASTNAME
  INTO :LASTNAME-HV
  FROM MY_EMP
  WHERE (PHONENO IS NOT NULL AND :PHONENO-HV :PHONENO-IND IS NOT NULL
         AND PHONENO = :PHONENO-HV )  -- Search condition for non-NULL
                                      -- phone number                             
         OR
        (PHONENO IS NULL AND :PHONENO-HV :PHONENO-IND IS NULL)
                                      -- Search condition for NULL
                                      -- phone number
END-EXEC.

:PHONENO-HVを「3476」に設定し、:PHONENO-INDを0に設定すると、NULL以外の電話番号の検索条件が使用されるため、SELECTステートメントは「THOMPSON」を返します。 :PHONENO-HVを任意の値に設定し、:PHONENO-INDを-1に設定すると、NULLの電話番号の検索条件が使用されるため、SELECTステートメントは「HAAS」を返します。

変更の終わり