%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}})
以下の関数は、配列内の項目のうち引数 と一致する項目の配列指標を戻します。
%LOOKUP は、キー付き配列データ構造内の項目の配列指標を戻すために使用することもできます。
指定された条件に一致する値がない場合は、ゼロが戻されます。 戻り値は符号なし整数形式 (タイプ U) です。
指定された条件に一致する要素が複数ある場合が
考えられます。以下の説明では、昇順配列と降順配列に次のような値が含まれていると
想定します。
+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-----------+---+---+---+---+---+---+---+
ASCEND | A | C | C | C | E | E | G |
-----------+---+---+---+---+---+---+---+
DESCEND | G | E | E | E | C | C | A |
-----------+---+---+---+---+---+---+---+

検索は指標開始指標 から始まり、要素数 個の要素について続けられます。デフォルトでは、配列全体が検索されます。
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 キーワードが指定された配列) を検索するために二分探索を使用します。
*..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
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