%LOOKUPxx (配列要素の検索)

%LOOKUP(arg : array | keyed_array_DS {: start_index {: number_of_elements}})
%LOOKUPLT(arg : array  {: start_index {: number_of_elements}})
%LOOKUPGE(arg : array  {: start_index {: number_of_elements}})
%LOOKUPGT(arg : array  {: start_index {: number_of_elements}})
%LOOKUPLE(arg : array  {: start_index {: number_of_elements}})
以下の関数は、配列内の項目のうち arg と一致する項目の配列指標を戻します。%LOOKUP は、キー付き配列データ構造内の項目の配列指標を戻すために使用することもできます。
%LOOKUP
正確に一致するもの。
%LOOKUPLT
引数 に最も近いが、引数 よりも小さいもの。
%LOOKUPLE
正確に一致しているか、または引数 に最も近いが引数 よりは小さい値。
%LOOKUPGT
引数 に最も近いが、引数 より大きいもの。
%LOOKUPGE
正確に一致しているか、または引数 に最も近いが引数 より大きい値。

指定された条件に一致する値がない場合は、ゼロが戻されます。 戻り値は符号なし整数形式 (タイプ U) です。

指定された条件に一致する要素が複数ある場合が 考えられます。 以下の説明では、昇順配列と降順配列に次のような値が含まれていると 想定します。

           +---+---+---+---+---+---+---+
           | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-----------+---+---+---+---+---+---+---+
ASCEND     | A | C | C | C | E | E | G |
-----------+---+---+---+---+---+---+---+
DESCEND    | G | E | E | E | C | C | A |
-----------+---+---+---+---+---+---+---+
  • %LOOKUP、%LOOKUPLE、または %LOOKUPGE では、 検索引数と等しい要素が複数ある場合、最初に一致した要素の 指標が戻されます。 例えば、検索引数が C の場合、これらの組み込み関数 は、昇順配列では 2 を戻し、降順配列では 5 を 戻します。
  • 昇順配列に対する %LOOKUPLE 組み込み関数では、検索引数と等しい要素がない 場合、検索引数よりも小さい最後の要素の指標が戻されます。 例えば、検索引数が D の場合、%LOOKUPLE は 4 を戻します。
  • 降順配列に対する %LOOKUPLE 組み込み関数では、検索引数と等しい要素がない 場合、検索引数よりも小さい最初の要素の指標が戻されます。 例えば、検索引数が D の場合、%LOOKUPLE は 5 を戻します。
  • 昇順配列に対する %LOOKUPGE 組み込み関数では、検索引数と等しい要素がない場合、 検索引数より大きい最初の要素の指標が戻されます。 例えば、検索引数が D の場合、%LOOKUPGE は 5 を戻します。
  • 降順配列に対する %LOOKUPGE 組み込み関数では、検索引数と等しい要素がない場合、 検索引数より大きい最後の要素の指標が戻されます。 例えば、検索引数が D の場合、%LOOKUPGE は 4 を戻します。
  • 昇順配列に対する %LOOKUPLT 組み込み関数では、 検索引数より小さい最後の要素の指標が戻されます。 例えば、検索引数が D の場合、%LOOKUPLT は 4 を戻します。
  • 降順配列に対する %LOOKUPLT 組み込み関数では、 検索引数より小さい最初の要素の指標が戻されます。 例えば、検索引数が D の場合、%LOOKUPLT は 5 を戻します。
  • 昇順配列に対する %LOOKUPGT 組み込み関数では、 検索引数より大きい最初の要素の指標が戻されます。 例えば、検索引数が D の場合、%LOOKUPGT は 5 を戻します。
  • 降順配列に対する %LOOKUPGT 組み込み関数では、 検索引数より大きい最後の要素の指標が戻されます。 例えば、検索引数が D の場合、%LOOKUPGT は 4 を戻します。

検索は指標開始指標 から始まり、要素数 個の要素について続けられます。 デフォルトでは、配列全体が検索されます。

2 番目のパラメーターには ARRAY_NAME 形式の スカラー配列を指定できます。 %LOOKUP の場合は、ARRAY_DS_NAME(*).SUBFIELD_NAME 形式のキー付き配列データ構造 を指定することも可能です。

配列データ構造を検索するには、データ構造名と指標 (*) を指定してから、検索のキーとして使用するサブフィールドを指定します。 例えば、配列データ構造 INFO のサブフィールド CODE で値 'XP2' を検索する場合、 最初のパラメーターとして 'XP2' を指定し、2 番目のパラメーターとして INFO(*).CODE を指定します。 修飾名で指標 (*) までの部分が配列を表し、 (*) の後の部分が、スカラー・サブフィールド、またはスカラーの指標付き配列を表す必要があります。

最初の 2 つのパラメーターはどんなタイプであっても構いませんが、同じタイプでなければなりません。 キー付きデータ構造配列の場合、最初のパラメーターは、キーとタイプが同じでなければなりません。 これらの長さまたは小数点以下の桁数は、同じである必要はありません。 3 番目と 4 番目のパラメーターは、小数点以下の桁数がゼロの非浮動数値である必要があります。

%LOOKUPLT、%LOOKUPLE、%LOOKUPGT、および %LOOKUPGE の場合、配列がキーワード ASCEND または DESCEND を使用して定義されている必要があります。 引数 または配列 が ALTSEQ(*NONE) を指定して定義されている場合を除 き、ALTSEQ テーブルが使用されます。

組み込み関数 %FOUND と %EQUAL は %LOOKUP 命令に続けて設定されません。

%LOOKUPxx 組み込み関数は、順序配列 (ASCEND または DESCEND キーワードが指定された配列) を検索するために二分探索を使用します。

注: LOOKUP 命令コードとは異なり、%LOOKUP は配列にのみ適用されます。 テーブル内の値を検索するには %TLOOKUP 組み込み関数を使用します。
詳細については、以下の資料を参照してください。
図 1. スカラー配列を持つ %LOOKUPxx
 *..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
 /FREE
   arr(1) = 'Cornwall';
   arr(2) = 'Kingston';
   arr(3) = 'London';
   arr(4) = 'Paris';
   arr(5) = 'Scarborough';
   arr(6) = 'York';

   n = %LOOKUP('Paris':arr);
   // n = 4

   n = %LOOKUP('Thunder Bay':arr);
   // n = 0 (not found)

   n = %LOOKUP('Kingston':arr:3);
   // n = 0 (not found after start index)

   n = %LOOKUPLE('Paris':arr);
   // n = 4

   n = %LOOKUPLE('Milton':arr);
   // n = 3

   n = %LOOKUPGT('Sudbury':arr);
   // n = 6

   n = %LOOKUPGT('Yorks':arr:2:4);
   // n = 0 (not found between elements 2 and 5)
 /END-FREE
図 2. 配列データ構造を持つ %LOOKUP
D emps            DS                  QUALIFIED DIM(20)
D    name                       25A   VARYING
D    id                          9S 0
D numEmps         S             10I 0
 /FREE
   emps(1).name = 'Mary';
   emps(1).id = 00138;
   emps(2).name = 'Patrick';
   emps(2).id = 10379;
   emps(3).name = 'Juan';
   emps(3).id = 06254;
   numEmps = 3;

   // Search for employee 'Patrick'
   n = %lookup('Patrick' : emps(*).name : 1 : numEmps);
   // n = 2

   // Search for the employee with id 06254
   n = %lookup(06254 : emps(*).id : 1 : numEmps);
   // n = 3

   // Search for employee 'Bill' (not found)
   n = %lookup('Bill' : emps(*).name : 1 : numEmps);
   // n = 0