論理式

論理式 は、真または偽に解決され、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、 limited-length STRING) の値が 2 つ含まれており、片方の値のバイト数が他方よりも少ない場合は、一時的な変換によって、短い方の値の右側に埋め込みが行われます。
    • MBCHAR 型の値と比較する場合は、CHAR 型または limited-length STRING 型の値の右側に、1 バイトのブランクが埋められます。
    • HEX 型の値と比較する場合は、CHAR 型または limited-length STRING 型の値の右側に、2 進ゼロが埋められます。
    • DBCHAR の値の右側には、2 バイトのブランクが埋められます。
    • UNICODE の値の右側には、ユニコードの 2 バイトのブランクが埋められます。
    • HEX 型の値の右側には、2 進ゼロが埋められます。例えば、値 "0A" を 2 バイトに拡張する必要がある場合、比較用の値は、"000A" ではなく、"0A00"となります。
  • 埋め込みが発生した後は、limited-length string 中の末尾ブランクは、その比較の間無視されます。しかし、STRING 型の他のフィールドの末尾ブランクは無視されません。
  • 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.