SELECT结构有两种基本用法,第一种为:
SELECT (选择表达式);
WHEN(值列表) 语句; WHEN(值列表) 语句; ……
OTHERWISE 语句;
END;
其中“选择表达式”是一个取数值、字符型值的变量或表达式,“值列表”为一项或者若干项,多项之间逗号分开,每项可以是一个与选择表达式相同取值类型的表达式。“语句”可以是单个语句或复合语句。执行SELECT结构时,先计算出选择表达式和值列表中的所有值,然后把选择表达式值由前向后与值列表中的值相比,发现相等值则执行对应的语句,然后退出SELECT结构(不再查看后面的值列表).如果选择表达式的值不等于任何值列表中的值则执行OTHERWISE对应的语句,这种情况下没有OTHERWISE语句会出错。
SELECT(month);
WHEN(?Feb?, ?Mar?, ?Apr?) put ?春天?; WHEN(?May?, ?Jun?, ?Jul?) put ?夏天?; OTHERWISE put '秋天或冬天'; END;
SELECT语句的另一种形式为:
SELECT;
WHEN(条件) 语句; WHEN(条件) 语句;
……
OTHERWISE 语句;
END;
这种SELECT语句没有选择表达式,而是在每一个 WHEN语句指定一个条件(逻辑表达式),执行第一个满足条件的WHEN后的语句。如果所有条件都不满足则执行OTHERWISE后的语句。
SELECT;
WHEN(age<=12) put ?少年?; WHEN(age<35) put ?青年?; OTHERWISE put ?中老年?;
END;
错误的方法 select (x);
when (x=2) put 'two'; end;
注意:对于select选择结构还有一点要注意的地方,就是select与end之间的程序的执行顺序,这跟其他语言(如C语言)可能有点差别,那就是只要有一个条件满足那么就会跳出选择结构,而不是继续执行下面的语句,这样一来就不需要显性的去跳出选择结构。
9.2 循环结构
SAS数据步可以使用功能强大的循环结构,主要有两种:计数DO循环和当型、直到型循环。
计数DO循环的写法是:
DO 指标变量=起始值 TO 结束值 BY 步长;
循环体语句…… END ;
在DO和END之间可以有多个语句。程序先把指标变量赋值为起始值,如果此值小于等于结束值则执行循环体语句,然后把指标变量加上步长,再判断它是否小于等于结束值,如果是则继续执行循环体,直到指标变量的值大于结束值为止。
上述结构中如果步长为1,则“BY 步长”可以省略。如果步长取负值,则继续循环的条件是指标变量大于等于结束值。例如: data;
DO i = 1 TO 20 BY 2; j = i**3;
put i 3. j 5.;
/* IF j GE 2000 THEN LEAVE; */ END; run;
可以输出一个1,3,5,7,…,19的立方表。在循环体中可以用LEAVE语句跳出循环,相当于C语言的break语句。
例如在上例中的循环体最后加上这样一句可以在立方大于1000时停止循环: IF j GT 1000 THEN LEAVE;
在循环体内用CONTINUE语句可以立即结束本轮循环并转入下一轮循环的判断与执行。比如: data;
do x=0 to 3.1415926 by 0.01; y = cos(x);
if y<0 then CONTINUE; z = sin(x);
put x 5.2 y 20.7 z 20.7;
output; end;
run;
以上程序对X由0到?= 3.1415926之间的数每隔0.01计算余弦值,如果余弦值为负则不执行下面的语句,而转到END语句,即考虑下一个X值,余弦值非负时计算正弦值并显示。因为余弦为负时没有任何结果显示,所以我们只能看到X=0到?/2时的cos(X)和sin(X)的结果.
指标变量设定的例子:
do i=2 to 10 by 2; do i=10 to 2 by –2; do x=3.6 to 4.8 by 0.05; do n=1, 5, 10, 30, 60; do n=1, 5 to 10 , 20 , 30 ; do month=?JAN?, ?FEB?, ?MAR?; do z=k to n/10 ;
do i='01JAN90'd to '01JAN91'd by 1; do i=10 to 0 by -1 while(month='JAN');
当型循环的语法是:
DO WHILE(循环继续条件); 循环体语句…… END;
程序先判断循环继续条件是否成立,成立时执行循环体语句;再判断循环继续条件,如此重复,直到循环继续条件不再成立。例如,下面的程序判断1333333是不是素数:
data;
x=1333333; i=3;
DO WHILE (mod(x,i) ^= 0); i=i+2; END;
if i 其中mod(x,i)表示x除以i的余数。 直到型循环的一般写法是: DO UNTIL (循环退出条件); 循环体语句…… END ; 程序先执行循环体,然后判断循环退出条件是否成立,成立则结束循环,否则继续。 注意每轮循环都是先执行循环体再判断是否退出。例如: data; n=0; do until (n>=5); n+1; put n=; end; run; 可以依次输出n=1,2,3,4,5,当n=5时退出条件“n>=5”满足,循环结束。 此例中语句:n+1;叫做累加语句,等价于 n=n+1;