データベーステーブルアクション内の Null 値の処理

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  データソースとターゲット > MapForce とデータベース > データをデータベースにマップする >

データベーステーブルアクション内の Null 値の処理

「Ignore If」、 「Update If」、 「Delete If」などのテーブルアクションを使用してマッピングがターゲットデータベースを更新する場合、 MapForce は ソースデータをターゲットデータに対して比較し、結果として内部データベース更新クエリを生成します。 (これらの内部クエリは、 MapForce の出力 ペイン内のプレビューのために使用することができます次を参照してください: データベースを変更するマッピングの実行)。 生成されたクエリは、 「データベーステーブルアクション」 ダイアログボックスから定義された比較条件を反映しています。

mf_dbnull_enabling

データベーステーブルアクション  ダイアログボックス

ソースまたはターゲットデータに nullable フィールドが含まれている場合、ソース内の null 値をターゲットデータ内の値と比較する方法が2つ存在します:

 

1.null 値を等価として扱う
2.null 値を等価として扱わない

 

デフォルトでは、 NULL-対応は、無効化されています。条件が満たされており、 NULL-対応が無効化されている場合、ターゲットデータベース テーブルが期待通り更新されないインスタンスが存在する場合があります (例えば、必要以上の行が挿入、または、更新されます)。 NULL 値 がデータの比較を影響し、希望しない結果を生成するためにこのような状況が発生します。このような状況を回避するために、「データベーステーブルアクション」 ダイアログボックスから各 Null 許容 フィールド (下のイメージ内 email ) の横のチェックボックスを選択します。

 

マッピング内の NULL 対応を良く理解するために、以下の条件が true の場合、 NULL データの比較が起こるサンプルを分析してみましょう:

 

1.「データベーステーブルアクション」 ダイアログボックスは、「Ignore if」、「 Update if」、「Delete if」アクションを含んでいます。
2.これらのアクションは、NULL 値を含んでいる可能性のあるレコードに対して行われます。
3.ソーステーブル内の NULL 値は、ターゲットテーブル内の NULL 値の等価として扱われる必要があります。

 

デフォルトでは、 NULL-対応は、無効化されています。条件が満たされており、 NULL-対応が無効化されている場合、ターゲットデータベース テーブルが期待通り更新されないインスタンスが存在する場合があります (例えば、必要以上の行が挿入、または、更新されます)。 NULL 値 がデータの比較を影響し、希望しない結果を生成するためにこのような状況が発生します。このような状況を回避するために、「データベーステーブルアクション」 ダイアログボックスから各 Null 許容 フィールド (下のイメージ内 email ) の横のチェックボックスを選択します。Null 許容であるフィールドのためにのみ、また、少なくとも1つのテーブルアクションが「等価」または「等価(大文字と小文字を区別しない)」場合のみ、チェックボックスを選択することができます。

 

 

サンプル

マッピング内の NULL 対応を良く理解するために、 NULL データの比較が起こるサンプルを分析してみましょう。 このサンプルは、 Microsoft SQL Server データベースを使用します。しかしながら、サポートされる他のデータベースの型にも適用することができます。任意で、Microsoft SQL Server を使用する場合、次のデータベーススクリプトを実行してこのサンプル内で使用されているテーブルとデータを作成することもできます: <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\CreateNullableFields.sql.

 

簡素化のために、データベーステーブルは以下のように説明されています。両方のテーブルは、個人のデータを保管しており、同じ列が存在しています。 更に、 列 email は、両方のテーブル内の null データを含むことができます。

 

+----+-----------+-----------+--------------------------+

| id | firstname | lastname  | email                    |

+----+-----------+-----------+--------------------------+

| 1  | Toby      | Hughey    | t.hughey@nanonull.com    |

| 2  | Mia       | Dahill    | NULL                     |

| 3  | Fred      | Weinstein | f.weinstein@nanonull.com |

+----+-----------+-----------+--------------------------+

SOURCE テーブル

 

+----+-----------+-----------+--------------------------+

| id | firstname | lastname  | email                    |

+----+-----------+-----------+--------------------------+

| 1  | Mia       | Dahill    | NULL                     |

| 2  | Fred      | Weinstein | f.weinstein@nanonull.com |

+----+-----------+-----------+--------------------------+

TARGET テーブル

SOURCE テーブルからのデータを TARGET テーブルにマージすることが目的と仮定します。新規のレコードのみが TARGET テーブルに挿入されます (このサンプルでは、 「Tobie Hughey」)。 両方のテーブルに存在するレコード(「Mia Dahill」 と 「Fred Weinstein」) は、無視されます。

 

タスクは以下のように達成することができます。

 

1.「挿入」 メニューから 「データベース」 を選択します。ウィザードステップに従い、 データベースに接続します。(次を参照: データベースに接続)。データベースオブジェクトを追加するようにプロンプトされると、 テーブル SOURCE を選択します。
2.「挿入」 メニューから 「データベース」 を選択します。 データベースに再接続し、テーブル TARGET をマッピングに追加します。
3.ソースとターゲットコンポーネント間のマッピング接続を描きます。

mf_dbnull_example1

1.Action:Insert tbl-act-icon ボタンをクリックして、 以下のようにデータベース テーブルアクションを構成します :

mf_dbnull_example2

上記のとおり、  「Ignore if.. Insert Rest」 アクションの組み合わせが定義されます。この構成は、各レコードに対してマッピングが以下をチェックします:

 

ソース内の firstname  は、ターゲット内の firstname と等しいです。そして、
ソース内の lastname  は、ターゲット内の lastname と等しいです。そして
ソース内の email  は、ターゲット内の email と等しいです。

 

上のすべての条件が満たされる場合、(条件に応じて) レコードは無視されます。それ以外の場合、 新規のレコードは、ターゲットテーブルに挿入されます。新規のレコードの id は、データベースにより生成されますが、他のフィールド (firstname、lastname、email) は、ソースからマップされた値を使用して表示されます。

email の横のチェックボックスは、このフィールドのための NULL-対応の比較を有効化、または、無効化することができます。email は Null の値を含むことができるため、このチェックボックスを選択する必要があります。(すなわち 「Mia Dahill」 には NULL 電子メールアドレスが存在するからです)。 チェックボックスの役割を確認するには、データベース を2度更新してください: 最初はチェックボックスを選択し更新し、2度目はチェックボックスのチェックが解除された状態で更新してください。

 

データベースを更新するには、出力 タブをクリックして、メニューコマンド 「出力 | SQL-スクリプトの実行」を実行します。

 

チェックボックスが選択されている場合、MapForce は NULL フィールドを等価として扱うように明示的に指定されています。ですから、 レコード 「Mia Dahill」 はターゲットテーブルに挿入されせん。これは期待されている結果です。

 

チェックボックスが選択されていない場合、 希望する結果ではないレコード 「Mia Dahill」 が(このレコードは既存にもかかわらず)ターゲットテーブルに挿入されます。MapForce に NULL 値を等価として扱うように明示的な指定が与えられていないからです 。 データベースに次のクエリを実行すると同様のシチュエーションが発生する可能性があります (NULL 値 が 「=」 演算子と比較され、 NULL 対応ではないためこのクエリは、レコードを抽出しません):

 

SELECT firstname, lastname, email FROM TARGET WHERE firstname = 'Mia' AND lastname = 'Dahill' AND email = NULL;

 

NULL に対応するには、 上のクエリ以下のように書かれる必要があります:

 

SELECT firstname, lastname, email FROM TARGET WHERE firstname = 'Mia' AND lastname = 'Dahill' AND email IS NULL;

 

メモ:上のクエリは、説明のためで、 MapForce により生成される内部クエリの実際の構文を反映していません。 (異なるデータベースベンダーは NULL 比較を異なるアプローチで処理するため) NULL 対応が有効化されると、 MapForce は、データベース型に応じて生成されたクエリの構文を適応します。

(C) 2019 Altova GmbH