メイン コンテンツをスキップする

Exists - スクリプト関数

Exists() は、特定の項目値がデータ ロード スクリプトの項目にすでにロードされているかどうかを決定します。この関数は TRUE または FALSE を返すため、LOAD ステートメントまたは IF ステートメントの where 句で使用できます。

注: Not Exists() を使用して、項目値がロード済みかどうかを判断することもできますが、Not Exists() を where 節で使用する場合は、用心するようお勧めします。Exists() 関数は、以前にロードされたテーブルと、現在のテーブルに以前にロードされた値の両方をテストします。そのため、最初の出現のみがロードされます。2 番目の出現に遭遇したときには、値はすでにロード済みです。詳細については、例を参照してください。

Syntax:  

Exists(field_name [, expr])

Return data type: ブール値

Arguments:  

引数
引数 説明
field_name

値を検索する項目の名前。明示的な項目名を引用符なしで使用できます。

この項目は、スクリプトによってロード済みでなければなりません。つまり、スクリプト内の節にロードされた項目を参照することはできません。

expr

存在するかどうかを確認したい値。明示的な値または数式を使用して、現在の Load ステートメント内の 1 つまたは複数の項目を参照できます。

注: 現在の Load ステートメントに含まれていない項目を参照することはできません。

この引数は省略可能です。省略した場合、この関数で、現在のレコード内に field_name の値がすでに存在しているかどうかが確認されます。

例で使用されているデータ:

LOAD * inline [ Employee|ID|Salary Bill|001|20000 John|002|30000 Steve|003|35000 ] (delimiter is '|');   Citizens: Load * inline [ Employee|Address Bill|New York Mary|London Steve|Chicago Lucy|Madrid Lucy|Paris John|Miami ] (delimiter is '|');   Drop Tables Employees;

Example:  

Exists (Employee)

現在のレコード内の項目 Employee の値が、その項目を含む読み取り済みのレコード内にすでに存在してれば、-1 (True) を返します。

ステートメント Exists (Employee, Employee)Exists (Employee) は同じ働きをします。

Example:  

Exists(Employee, 'Bill')

項目値 'Bill' が項目 Employee の現在のコンテンツに含まれていれば、-1 (True) を返します。

Example:  

Employees:
LOAD * inline [ Employee|ID|Salary Bill|001|20000 John|002|30000 Steve|003|35000 ] (delimiter is '|');   Citizens: Load * inline [ Employee|Address Bill|New York Mary|London Steve|Chicago Lucy|Madrid Lucy|Paris John|Miami ] (delimiter is '|') where Exists (Employee);   Drop Tables Employees;

 

この結果は、Employee 軸と Address 軸を使用してテーブル ビジュアライゼーションで使用できるテーブルとなります。

wherewhere Exists (Employee) は、テーブル Citizens から Employees にも存在する Name のみを新しいテーブルにロードすることを意味します。Drop ステートメントは、混同を避けるためにテーブル Employees を削除します。

結果
   
Employee Address
Bill New York
John Miami
Steve Chicago

Example:  

Employees: Load * inline [ Employee|ID|Salary Bill|001|20000 John|002|30000 Steve|003|35000 ] (delimiter is '|');   Citizens: Load * inline [ Employee|Address Bill|New York Mary|London Steve|Chicago Lucy|Madrid Lucy|Paris John|Miami22222222223
+0 ] (delimiter is '|') where not Exists (Employee);   Drop Tables Employees;

 

where 節に not が含まれています: where not Exists (Employee, Name)

つまり、テーブル Citizens から Employees に存在しない名前のみが新しいテーブルにロードされます。

Citizens テーブルには Lucy の値が 2 つありますが、結果テーブルに含まれているのは 1 つだけであることに注目してください。最初の行をロードすると、値が Employee シンボル テーブルに含められます。このため、2 行目を確認すると、その時点で値が存在しています。

次の例は、すべての値をロードする方法を示しています。

結果
Employee 住所
Mary London
Lucy Madrid

Example:  

Employees: Load Employee As Name, ID, Salary; LOAD * inline [ Employee|ID|Salary Bill|001|20000 John|002|30000 Steve|003|35000 ] (delimiter is '|');   Citizens: Load * inline [ Employee|Address Bill|New York Mary|London Steve|Chicago Lucy|Madrid Lucy|Paris John|Miami ] (delimiter is '|') where not Exists (Name, Employee);   Drop Tables Employees;

 

Lucy のすべての値を取得できるようにするには、次の 2 つの変更を行う必要があります。

  • Employees の前に Load を追加し、そこで名前を Employee から Name に変更します。

    Load Employee As Name, ID, Salary;

  • Citizens の Where 条件を次のように変更します。

    not Exists (Name, Employee).

これで、Name および Employee について別々のシンボル テーブルが作成されます。Lucy の 2 行目を確認すると、引き続き Name には存在していません。

結果
Employee 住所
Mary London
Lucy Madrid
Lucy Paris