
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」を返します。
