論理式

論理式 は、真または偽に解決され、if 文か while 文、あるいは (状況によっては) case 文の中で基準として使用されます。

基本論理式

基本論理式は、オペランド、比較演算子、および 2 番目の演算子から構成されます。詳細については、次の構文図と表を参照してください。


基本論理式の構文図

第 1 オペランド 比較演算子 第 2 オペランド
日時式 次のいずれか

==, != , <, >, <=, >=
日時式

最初および 2 番目の式は、互換タイプのものでなければなりません。

日付/時刻を比較する場合、より大符号 (>) は遅い時刻を意味し、より小符号 (<) は早い時刻を意味します。

数式 次のいずれか

==, != , <, >, <=, >=
数式
ストリング式 次のいずれか

==, != , <, >, <=, >=
ストリング式
ストリング式 like likeCriterion。これは、ストリング式 を左から右へ文字位置ごとに比較する対象となる文字フィールドまたはリテラルです。この機能の用途は、SQL 照会におけるキーワード like の用途によく似ています。

escChar は 1 文字からなるフィールドまたはリテラルで、1 つのエスケープ文字へ解決されます。

詳細については、『like 演算子』を参照してください。

ストリング式 matches matchCriterion。これは、ストリング式 を左から右へ文字位置ごとに比較する対象となる文字フィールドまたはリテラルです。この機能の用途は、UNIX® または Perl における正規表現 の用途によく似ています。

escChar は 1 文字からなるフィールドまたはリテラルで、1 つのエスケープ文字へ解決されます。

詳細については、『matches 演算子』を参照してください。

NUM 型または CHAR 型の値 (第 2 オペランドの説明を参照) 次のいずれか

==, != , <, >, <=, >=
NUM 型または CHAR 型の値。次のものを指定できます。
  • NUM 型で小数部を持たないフィールド
  • 整数リテラル
  • CHAR 型のフィールドまたはリテラル
searchValue in arrayName。詳細については、『in』を参照してください。
SQL レコードに入っていないフィールド 次のいずれか
  • is
  • not
次のいずれか
  • ブランク (文字フィールドの値がブランクのみであるかどうかをテストする場合のみ)
  • 数値 (CHAR 型または MBCHAR 型のフィールドの値が数値であるかどうかをテストする場合)
SQL レコード内のフィールド 次のいずれか
  • is
  • not
次のいずれか
  • ブランク (文字フィールドの値がブランクのみであるかどうかをテストする場合のみ)
  • null (set 文またはリレーショナル・データベースからの読み取りによって、フィールドが NULL に設定されたかどうかをテストする場合)
  • 数値 (CHAR 型または MBCHAR 型のフィールドの値が数値であるかどうかをテストする場合)
  • trunc (1 バイトまたは 2 バイト文字の値がリレーショナル・データベースからフィールドに最後に読み取られたとき、非ブランク文字の右側が削除されたかどうかをテストする場合)

trunc テストが真に解決されるのは、データベースの列がフィールドよりも長い場合に限られます。値がフィールドに移動した後、またはフィールドが NULL に設定された後、テストの値は偽になります。

textField (テキスト書式内のフィールドの名前) 次のいずれか
  • is
  • not
次のいずれか
  • ブランク (テキスト・フィールドの値が ブランクまたは NULL に限定されているかどうかをテストする場合)
    ブランクかどうかのテストは、 ユーザーの書式への最後の入力に基づき、書式フィールドの現行内容に基づくわけではありません。 is を使用するテストでは、以下の場合は真になります。
    • ユーザーの最後の入力がブランクまたは NULL。
    • プログラムの開始以降、またはタイプ set form initial の set 文が実行されて以降、ユーザーがデータを入力していない。
  • カーソル (ユーザーが指定のテキスト・フィールドにカーソルを残しているかどうかをテストする場合)
  • データ (ブランクまたは NULL 以外のデータが指定のテキスト・フィールドにあるかどうかをテストする場合)
  • 変更 (フィールドの変更データ・タグが設定されているかどうかをテストする場合。『変更データ・タグとプロパティー』に説明があります。)
  • 数値 (CHAR 型または MBCHAR 型のフィールドの値が数値であるかどうかをテストする場合)
ConverseVar.eventKey 次のいずれか
  • is
  • not
詳細については、『ConverseVar.eventKey』を参照してください。
sysVar.systemType 次のいずれか
  • is
  • not
詳細については、『sysVar.systemType』を参照してください。

is または not を使用して、VGLib.getVAGSysType により戻された値をテストすることはできません。

record name 次のいずれか
  • is
  • not
レコード編成に適合した入出力エラー値。『入出力エラー値』を参照してください。

次の表は、比較演算子をまとめたものです。比較演算子は、それぞれ真または偽に解決される式の中で使用されます。

演算子 用途
== = 演算子は、2 つのオペランドの値が同じであるかどうかを示します。
!= != 演算子は、2 つのオペランドの値が異なっているかどうかを示します。
< less than 演算子は、1 番目のオペランドの値が 2 番目のオペランドの値より小さいかどうかを示します。
> greater than 演算子は、1 番目のオペランドの値が 2 番目のオペランドの値より大きいかどうかを示します。
<= less than or equal to 演算子は、1 番目のオペランドの値が 2 番目のオペランドの値以下であるかどうかを示します。
>= greater than or equal to 演算子は、1 番目のオペランドの値が 2 番目のオペランドの値以上であるかどうかを示します。
in in 演算子は、1 番目のオペランドが、配列を参照する 2 番目のオペランドの値であるかどうかを示します。詳細については、『in』を参照してください。
is is 演算子は、1 番目のオペランドが 2 番目のオペランドのカテゴリーに含まれるかどうかを示します。詳細については、前の表を参照してください。
like like 演算子は、『like 演算子』で説明されているように、2 つあるオペランドの最初のオペランドに含まれている文字が、第 2 オペランドと一致するかどうかを示します。
matches matches 演算子は、『matches 演算子』で説明されているように、2 つあるオペランドの最初のオペランドに含まれている文字が、第 2 オペランドと一致するかどうかを示します。
not not 演算子は、1 番目のオペランドが 2 番目のオペランドのカテゴリーに含まれないかどうかを示します。詳細については、前の表を参照してください。

次の表とそれに続く説明は、オペランドの型に関する互換性の規則を示しています。

第 1 オペランドのプリミティブ型 第 2 オペランドのプリミティブ型
BIN BIN、DECIMAL、FLOAT、MONEY、NUM、NUMC、PACF、SMALLFLOAT
CHAR CHAR、DATE、HEX、MBCHAR、NUM、TIME、TIMESTAMP
DATE CHAR、DATE、NUM、TIMESTAMP
DBCHAR DBCHAR
DECIMAL BIN、DECIMAL、FLOAT、MONEY、NUM、NUMC、PACF、SMALLFLOAT
HEX CHAR、HEX
MBCHAR CHAR、MBCHAR
MONEY BIN、DECIMAL、FLOAT、MONEY、NUM、NUMC、PACF、SMALLFLOAT
NUM BIN、CHAR、DATE、DECIMAL、FLOAT、MONEY、NUM、NUMC、PACF、SMALLFLOAT、TIME
NUMC BIN、DECIMAL、FLOAT、MONEY、NUM、NUMC、PACF、SMALLFLOAT
PACF BIN、DECIMAL、FLOAT、MONEY、NUM、NUMC、PACF、SMALLFLOAT
TIME CHAR、NUM、TIME、TIMESTAMP
TIMESTAMP CHAR、DATE、TIME、TIMESTAMP
UNICODE UNICODE
表の説明を以下に詳しく示します。
  • 数値型 (BIN、DECIMAL、FLOAT、MONEY、NUM、NUMC、PACF、SMALLFLOAT) の値は、任意の数値型およびサイズを持つ値と比較できます。EGL は、必要に応じて、一時的な変換を実行します。小数部が同等の場合の = 比較は、小数部が全く同じでなくとも、真に評価されます (例えば、1.4 と 1.40)。
  • CHAR 型の値は、その各文字が 16 進数文字 (0 から 9、A から F、a から f) の範囲内にある場合にのみ、HEX 型の値と比較できます。EGL は、CHAR 型の値に含まれる小文字を、一時的に大文字に変換します。
  • 比較において、文字型 (CHAR、DBCHAR、HEX、 MBCHAR、UNICODE) の値が 2 つ含まれており、片方の値のバイト数が他方よりも少ない場合は、一時的な変換によって、短い方の値の右側に埋め込みが行われます。
    • MBCHAR 型の値と比較する場合は、CHAR 型の値の右側に、1 バイトのブランクが埋められます。
    • HEX 型の値と比較する場合は、CHAR 型の値の右側に、2 進ゼロが埋められます。
    • DBCHAR の値の右側には、2 バイトのブランクが埋められます。
    • UNICODE の値の右側には、ユニコードの 2 バイトのブランクが埋められます。
    • HEX 型の値の右側には、2 進ゼロが埋められます。例えば、値 "0A" を 2 バイトに拡張する必要がある場合、比較用の値は、"000A" ではなく、"0A00"となります。
  • CHAR 型の値は、次の条件が該当する場合にのみ、NUM 型の値と比較できます。
    • CHAR 型の値に 1 バイトの数字のみが含まれており、その他の文字は含まれていない場合。
    • NUM 型の値の定義に小数点が含まれていない場合。
    CHAR 型と NUM 型の比較は、次のように行われます。
    • 一時的な変換により、NUM の値が CHAR 形式に変換されます。数字は左そろえされ、必要に応じて 1 バイトのブランクが付加されます。例えば、長さ 4 の NUM 型のフィールドが 7 の値を持つ場合、その値は、右側にブランクが 3 つ付加された「7」として扱われます。
    • フィールドの長さが同じでない場合は、一時的な変換によって、短い方の値の右側にブランクが埋められます。
    • 比較では、バイト単位で値が検査されます。次の 2 つの例を考えてください。
      • 長さが 2 で値が「7」(ブランクを含む) の CHAR 型のフィールドは、長さが 1 で値が 7 の NUM 型のフィールドと同じです。なぜなら、NUM 型のフィールドに基づく一時的なフィールドには、最後のブランクも含まれるからです。
      • 値が「8」の CHAR 型のフィールドは、値が 534 の NUM 型のフィールドより大きくなります。なぜなら、ASCII または EBCDIC の検索順序では、「8」が「5」の後にくるからです。

複合論理式

より複雑な式を作成するには、and (&&) 演算子または or 演算子 (||) のいずれかを使用して、比較的単純な一組の式を結合します。その他に、not 演算子 (!) を使用することもできますが、これについては後で説明します。

論理式が、基本論理式を or 演算子で結合したものからなる場合、EGL は、優先順位の規則に従って、式を評価します。ただし、基本論理式の 1 つが真に解決された場合は、評価が停止されます。次の例を考えてください。
  field01 == field02 || 3 in array03 || x == y

field01 と field02 が等しくない場合は、評価が続行されます。しかし、値 3 が array03 内にある場合は、式全体が真であることが証明されるため、最後の基本論理式 (x == y) は評価されません。

同様に、基本論理式を and 演算子で結合した場合、その 1 つが偽に解決されると、EGL は評価を停止します。次の例では、field01 が field02 と同じでないことが判明した時点で、評価が停止されます。

  field01 == field02 && 3 in array03 && x == y
論理式で括弧をペアで使用すると、次のことが可能になります。
  • 評価の順序を変更する。
  • 式の意味を明確にする。
  • not 演算子 (!) を使用可能にする。not 演算子は、その直後の論理式の値とは反対のブール値 (真または偽) に解決されます。not 演算子の直後の式は、括弧で囲む必要があります。

次の例では、value1 には「1」、value2 には「2」のように指定されているとします。

   /* == 真となる式 */
      value5 < value2 + value4

   /* == 偽となる式 */
      !(value1 is numeric)

   /* == 生成された出力が真となる
                   Windows 2000、Windows NT、または
             z/OS UNIX システム・サービス */
   sysVar.systemType is WIN || sysVar.systemType is USS

   /* == 真となる式 */
   (value6 < 5 || value2 + 3 >= value5) && value2  == 2
ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.
(C) Copyright IBM Japan 2005.