プライマリ・コンテンツに移動
Oracle® Databaseユーティリティ
12cリリース1 (12.1.0.2)
B71303-09
目次へ移動
目次
索引へ移動
索引

前
次

WHEN、NULLIFおよびDEFAULTIF句の使用

次の説明は、スカラー・フィールドに適用されます。非スカラー・フィールド(列オブジェクト、LOBおよびコレクション)はより複雑なため、WHENNULLIFおよびDEFAULTIF句は異なる方法で処理されます。

WHENNULLIFまたはDEFAULTIF句は、フィールド名を指定するか、フィールド位置を指定するかによって、結果が異なります。

フィールドに切り捨てられた空白がある場合、あるいはWHENNULLIFまたはDEFAULTIF句に空白およびタブが含まれているか、BLANKSパラメータが使用されている場合は、異なる結果が得られます。名前で指定されているフィールドおよび位置で指定されているフィールドに対して同じ結果が必要な場合は、PRESERVE BLANKSオプションを使用します。PRESERVE BLANKSオプションによって、フィールド値の評価時にSQL*Loaderによって空白文字が切り捨てられないようにします。

WHENNULLIFまたはDEFAULTIF句は、SQL*Loaderの処理手順によっても結果に影響します。SQL*Loaderは次の手順を順番に実行します。ただし、すべての手順を実行するわけではありません。フィールドが設定されると、設定作業の残りの手順は無視されます。たとえば、手順5でフィールドが設定された場合、SQL*Loaderは手順6には進みません。

  1. SQL*Loaderで、入力レコードの各フィールドの値が評価され、空白およびタブの切り捨てに関する既存のガイドラインに従って、切り捨てる必要のある空白が切り捨てられます。

  2. 各レコードに対して、SQL*Loaderで表のWHEN句が評価されます。

  3. レコードが表のWHEN句を満たす場合、またはWHENが指定されていない場合は、SQL*Loaderで、NULLIF句の各フィールドが確認されます。

  4. NULLIF句が存在する場合は、SQL*Loaderで評価されます。

  5. NULLIF句が満たされている場合は、SQL*LoaderではフィールドがNULLに設定されます。

  6. NULLIF句が満たされていない場合、またはNULLIF句がない場合は、SQL*Loaderのフィールド評価によってフィールド長が確認されます。フィールドがフィールド評価の結果、0の長さを持っている場合(たとえば、NULLフィールドまたは結果としてNULLフィールドとなる空白の切捨て)は、SQL*LoaderでフィールドがNULLに設定されます。この場合、フィールドに指定されたDEFAULTIF句は評価されません。

  7. 指定されたNULLIF句が偽の場合、またはNULLIF句がない場合、およびフィールドがフィールド評価の結果、0の長さを持たない場合は、SQL*Loaderで、DEFAULTIF句に対するフィールドが確認されます。

  8. DEFAULTIF句が存在する場合は、SQL*Loaderで評価されます。

  9. DEFAULTIF句が満たされていて、データ・ファイルのフィールドが数値フィールドの場合、フィールドは0に設定されます。フィールドが数値フィールドではない場合、NULLに設定されます。次のフィールドは数値フィールドで、DEFAULTIF句を満たす場合は、0に設定されます。

    • BYTEINT

    • SMALLINT

    • INTEGER

    • FLOAT

    • DOUBLE

    • ZONED

    • (パック)DECIMAL

    • 数値型 EXTERNAL(INTEGERFLOATDECIMALおよびZONED)

  10. DEFAULTIF句が満たされていない場合、またはDEFAULTIF句がない場合は、SQL*Loaderによって、手順1の評価値でフィールドが設定されます。

SQL*Loaderの操作順序が原因で、予期しない結果となる場合があります。たとえば、DEFAULTIF句は、数値フィールドを0ではなくNULLに設定しているように見える場合があります。

注意:

これらの手順に示したとおり、NULLIFおよびDEFAULTIF句を使用した場合は、SQL*Loaderによる処理が増えます。そのためパフォーマンスに影響する可能性があります。手順1では、0と評価されたフィールドは、SQL*LoaderによってNULL値に設定されます。パフォーマンスを向上させるには、この機能を利用するためにデータを変更できるかどうかを検討してください。手順1でのNULL値の検出は、NULLIF句またはDEFAULTIF句の処理よりはるかに迅速に行われます。

たとえば、CHAR(5)は、論理レコードの終わりまでに格納されない場合、またはすべての空白が含まれ、空白の切捨てが有効になっている場合は、データ長が0になります。デリミタで区切られたフィールドは、フィールドの開始と終了記号の間に文字がない場合、データ長が0になります。

また、文字フィールドの場合は、通常、NULLIFの方がDEFAULTIFより迅速に処理されます(文字フィールドのデフォルト値はNULLです)。