逻辑表达式

逻辑表达式的结果为 true 或 false,并且在 ifwhile 语句或(在某些情况下)case 语句中用作条件。

基本逻辑表达式

基本逻辑表达式由操作数、比较运算符和第二个操作数组成,如以下语法图及后续表所示:


基本逻辑表达式的语法图

第一个操作数 比较运算符 第二个操作数
日期时间表达式 下列其中一项:

==, != , <, >, <=, >=
日期时间表达式

第一个和第二个表达式必须是兼容类型。

如果是日期时间比较,则大于号(>)表示以后的时间,小于号(<)表示以前的时间。

数字表达式 下列其中一项:

==, != , <, >, <=, >=
数字表达式
字符串表达式 下列其中一项:

==, != , <, >, <=, >=
字符串表达式
字符串表达式 like likeCriterion,这是将对其比较字符串表达式的字符字段或文字,比较方式是从左至右比较逐个字符位置。此功能的用法类似于 SQL 查询中的关键字 like 的用法。

escChar 是解析为转义字符的单字符字段或文字。

有关更多详细信息,请参阅 like 运算符

字符串表达式 匹配 matchCriterion,这是将对其比较字符串表达式的字符字段或文字,比较方式是从左至右比较逐个字符位置。此功能的用法类似于 UNIX® 或 Perl 中的正则表达式的用法。

escChar 是解析为转义字符的单字符字段或文字。

有关更多详细信息,请参阅 matches 运算符

Value of type NUM or CHAR,如对第二个操作数所述 下列其中一项:

==, != , <, >, <=, >=
Value of type NUM or CHAR,它可以是下列任何一项:
  • 类型为 NUM 并且没有小数位的字段
  • 整数文字
  • 类型为 CHAR 的字段或文字
searchValue in arrayName;有关详细信息,请参阅 in
field not in SQL record 下列其中一项:
  • is
  • not
下列其中一项:
  • blanks(用于测试字符字段的值是否只包含空格)
  • numeric(用于测试类型为 CHAR 或 MBCHAR 的字段的值是否为数字)
field in an SQL record 下列其中一项:
  • is
  • not
下列其中一项:
  • blanks(用于测试字符字段的值是否只包含空格)
  • null(用于测试是否已通过 set 语句或通过从关系数据库读取将该字段设置为 NULL)
  • numeric(用于测试类型为 CHAR 或 MBCHAR 的字段的值是否为数字)
  • trunc(用于测试上一次从关系数据库将单字节或双字节字符值读取到该字段中时,是否删除右边的非空格字符)

仅当数据库列的长度超过该字段的长度时,trunc 测试结果才是 true。在将值移动到字段之后或在将字段设置为 NULL 后,测试结果值为 false。

textField(文本表单中的字段的名称) 下列其中一项:
  • is
  • not
下列其中一项:
  • blanks(用于测试文本字段的值是否被限制为空白或 NULL)。
    blanks 测试基于用户在表单中上次输入的内容,而不是基于表单字段的当前内容;在下列情况下,使用 is 的测试将得到 true 结果:
    • 用户上次输入的内容是空白或 NULL;或者
    • 在启动程序之后,或者在运行具有 set form initial 类型的 set 语句之后,用户未在字段中输入任何数据。
  • cursor(用于测试用户是否将光标留在指定的文本字段中)。
  • data(用于测试指定的文本字段是否包含除空白或 NULL 以外的数据)。
  • modified(用于测试是否已设置字段的已修正数据标记,如已修正数据标记和 modified 属性所述)。
  • numeric(用于测试类型为 CHAR 或 MBCHAR 的字段的值是否为数字)。
ConverseVar.eventKey 下列其中一项:
  • is
  • not
有关详细信息,请参阅 ConverseVar.eventKey
sysVar.systemType 下列其中一项:
  • is
  • not
有关详细信息,请参阅 sysVar.systemType

不能使用 isnot 来测试 VGLib.getVAGSysType 返回的值。

record name 下列其中一项:
  • is
  • not
适用于记录组织的 I/O 错误值。请参阅 I/O 错误值

下表列示比较运算符,其中每个运算符在表达式中使用时将解析为 true 或 false。

运算符 用途
== 等于运算符指示两个操作数的值是否相等。
!= 不等于运算符指示两个操作数是否具有不同的值。
< 小于运算符指示第一个操作数在数字上是否小于第二个操作数。
> 大于运算符指示第一个操作数在数字上是否大于第二个操作数。
<= 小于等于运算符指示第一个操作数在数字上是否小于等于第二个操作数。
>= 大于等于运算符指示第一个操作数在数字上是否大于等于第二个操作数。
in in 运算符指示两个操作数中的第一个操作数是否是第二个操作数(它引用数组)中的值。有关详细信息,请参阅 in
is is 运算符指示两个操作数中的第一个操作数是否在第二个操作数的类别中。有关详细信息,请参阅上表。
like like 运算符指示两个操作数中的第一个操作数中的字符是否与第二个操作数中的字符相匹配,如 like 运算符中所述。
匹配 matches 运算符指示两个操作数中的第一个操作数中的字符是否与第二个操作数中的字符相匹配,如 matches 运算符中所述。
not not 运算符指示两个操作数中的第一个操作数是否不在第二个操作数的类别中。有关详细信息,请参阅上表。

下表及随后的解释说明操作数具有指定类型时的兼容性规则。

第一个操作数的基本类型 第二个操作数的基本类型
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)求值为 true,即使小数位不同。
  • 仅当类型为 CHAR 的每个字符都在十六进制数字(0 至 9、A 至 F 以及 a 至 f)的范围内时,类型为 CHAR 的值才能与类型为 HEX 的值进行比较。在类型为 CHAR 的值中,EGL 将所有小写字母临时转换为大写字母。
  • 如果比较包括两个具有字符类型(CHAR、DBCHAR、HEX、MBCHAR 和 UNICODE)的值,并且一个值比另一个值的字节数要少,则临时转换将在较短值的右边进行填充:
    • 在与类型为 MBCHAR 的值的比较中,将在类型为 CHAR 的值的右边填充单字节空格
    • 在与类型为 HEX 的值的比较中,将在类型为 CHAR 的值的右边填充二进制零
    • 在类型为 DBCHAR 的值的右边填充双字节空格
    • 在类型为 UNICODE 的值的右边填充 Unicode 双字节空格
    • 在类型为 HEX 的值的右边填充二进制零,这意味着(例如)如果必须将值“0A”扩展为两个字节,则用于比较的值为“0A00”而不是“000A”
  • 仅当下列条件适用时,类型为 CHAR 值才能与类型为 NUM 的值进行比较:
    • 类型为 CHAR 的值具有单字节数字,没有其它任何字符
    • 类型为 NUM 的值的定义没有小数点
    CHAR 至 NUM 的比较按如下方式进行:
    • 临时转换将 NUM 值放置到 CHAR 格式中。数字字符是向左对齐的,并根据需要带上附加单字节空格。例如,如果长度为 4 的 NUM 类型的字段的值为 7,则将该值视为“7”,且右边带有三个空格。
    • 如果各个字段的长度不匹配,则临时转换将在较短值的右边填充空格。
    • 比较将逐字节地检查值。考虑下列两个示例:
      • 长度为 2、值为“7 ”(包含空格)并且类型为 CHAR 的字段与长度为 1、值为 7 并且类型为 NUM 的字段相等,因为基于 NUM 类型的字段的临时字段也包含最后空格
      • 值为“8”的类型为 CHAR 的字段大于值为 534 的类型为 NUM 的字段,这是因为在 ASCII 或 EBCDIC 搜索顺序中,“8”位于“5”之后

复杂逻辑表达式

通过使用 and(&&)或 or 运算符(||)组合一对较基本的表达式,可以构建更复杂的表达式。此外,也可以使用 not 运算符(!),如稍后所描述的那样。

如果逻辑表达式由 or 运算符组合的基本逻辑表达式组成,则 EGL 将根据优先顺序规则对表达式求值,但如果其中一个基本逻辑表达式的结果为 true,则将停止求值。请参照以下示例:
  field01 == field02 || 3 in array03 || x == y

如果 field01 不等于 field02,则求值将继续。但是,如果 array03 包含值 3,则整个表达式求值为 true,并且不会对最后一个基本逻辑表达式(x == y)求值。

同样,如果用 and 运算符将基本逻辑表达式组合起来,则如果其中一个基本逻辑表达式解析为 false,EGL 将停止求值。在以下示例中,只要发现 field01 不等于 field02,求值就会停止:

  field01 == field02 && 3 in array03 && x == y
可以在逻辑表达式中使用成对圆括号来实现下列任何目的:
  • 更改求值顺序。
  • 阐明意义。
  • 能够使用 not 运算符(!),它解析为与其后紧跟的逻辑表达式的值相反的布尔值(true 或 false)。必须将后继表达式括在圆括号中。

示例

在查看下面的示例时,假定 value1 包含“1”,value2 包含“2”,依此类推:

   /* == true */
   value5 < value2 + value4

   /* == false */
   !(value1 is numeric)

   /* == true when the generated output runs 
             on Windows 2000, Windows NT,
             or z/OS UNIX System Services */
   sysVar.systemType is WIN || sysVar.systemType is USS

   /* == true */
   (value6 < 5 || value2 + 3 >= value5) && value2  == 2
使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.