第六十章 Caché 函数大全 $SELECT 函数
返回与第一个真表达式关联的值。
大纲
$SELECT(expression:value,...)
$S(expression:value,...)
参数
- expression 关联值参数的选择测试。
- value 如果关联表达式的计算结果为true,则返回的值。
描述
$SELECT函数返回与第一个表达式关联的值,该表达式的值为true(1)。每个$SELECT参数都是一对用冒号分隔的表达式。左半部分是一个真值表达式。右半部分可以是任何表达式。在下面的示例中,测试了前三个表达式的真值;如果它们都不为真,则最终表达式(始终为真)将返回其值:
WRITE $SELECT(x=1:"1st is True",x=2:"2nd is True",x=3:"3rd is True",1:"The Default")
指定的expression:value对列表可以是任意长度。 $SELECT从左到右就散参数。当$SELECT发现值为true(1)的真值表达式时,它将返回匹配表达式到冒号右边。在发现最左边的真值表达式之后,$SELECT停止计算。它从不止计参数列表中的后续对。
可以通过嵌套$SELECT函数来构造复杂的逻辑。像所有计算的真值条件一样,可以将NOT逻辑运算符(')应用于嵌套的$SELECT。
参数
expression
关联值参数的选择测试。它可以是任何有效的Caché关系或逻辑表达式。如果没有表达式的计算结果为true,则系统会生成<SELECT>错误。为了防止错误干扰正在执行的例程,最终表达式可以是值1,该值始终为true。
value
如果关联表达式的计算结果为true,则返回的值。它可以是数值,字符串文字,变量名或任何有效的ObjectScript表达式。如果为值指定表达式,则仅在关联表达式的计算结果为true后才对其进行计算。如果value包含带下标的全局引用,则在评估时会更改裸指标。因此,在$SELECT函数之内或之后立即使用裸全局引用时,请当心。
示例
要确保不会出现<SELECT>错误,应始终使用适当的默认值将值1作为最后一个表达式包含在内。下面的示例显示了这一点:
StartS
READ !,"Which level?: ",a
QUIT:a=""
SET x=$SELECT(a=1:"Level1",a=2:"Level2",a=3:"Level3",1:"Start")
DO @x
Level1()
WRITE !,"This is Level 1"
Level2()
WRITE !,"This is Level 2"
Level3()
WRITE !,"This is Level 3"
DHC-APP>d StartS^PHA.TEST.Command
Which level?: 2
This is Level 2
如果用户输入的值不是1、2、3或空字符串,则控制权将传递回例程的顶部。
可以使用$SELECT替换多个IF子句。下面的示例使用IF、ELSEIF和ELSE子句来确定数字是奇数还是偶数:
OddEven()
READ !,"Enter an Integer: ",x
QUIT:x=""
WRITE !,"The input value is "
IF 0=$ISVALIDNUM(x) { WRITE "not a number" }
ELSEIF x=0 { WRITE "zero" }
ELSEIF ""=$NUMBER(x,"I") { WRITE "not an integer" }
ELSEIF x#2=1 { WRITE "odd" }
ELSE { WRITE "even" }
DO OddEven
DHC-APP>d OddEven^PHA.TEST.Command
Enter an Integer: 2
The input value is even
Enter an Integer: d OddEven^PHA.TEST.Command
The input value is not a number
Enter an Integer: 4
The input value is even
Enter an Integer: d OddEven^PHA.TEST.Command
The input value is not a number
Enter an Integer: 3
The input value is odd
下面的示例还接受一个数字,并确定该数字是奇数还是偶数。它使用$SELECT替换上一个示例中的if命令:
OddEven1()
READ !,"Enter an Integer: ",x
QUIT:x=""
WRITE !,"The input value is "
WRITE $SELECT(0=$ISVALIDNUM(x):"not a number",x=0:"zero",
""=$NUMBER(x,"I"):"not an integer",x#2=1:"odd",1:"even")
DO OddEven1
DHC-APP>d OddEven1^PHA.TEST.Command
Enter an Integer: 2
The input value is even
Enter an Integer: 3
The input value is odd