运算符是表示算术、比较、逻辑等关系的特殊符号。根据其所在位置可分为: - 前缀运算符:即用于操作数前的运算符,如正号(+)、负号(-)等。
- 中缀运算符:即用于操作数中间的运算符。
也可以根据其用途及用法分为: - 算术运算符
- 比较运算符
- 逻辑(或布尔)运算符
- 极大或极小运算符
- 串联运算符
1、算术运算符(Arithmetic Operators) 是指进行算术运算的符号。 算术运算符其及其涵义 | 符号 | 定义 | 样例 | 结果 | ** | 求幂 | a**3 | a的3次方 | * | 乘 | 2*y | 2乘以y | / | 除 | var/5 | Var除以5 | + | 加 | num+3 | Num加3 | - | 减 | sale-discount | Sale减discount |
注意:(1)在表示乘法的运算中“*”是必须的,例如,表示2 乘以Y 用运算符表达即2*Y,而2Y 和2(Y)都是无效的表达式;(2)如果算术运算符有一个运算对象是缺失值,则结果也
是缺失值。 2、比较运算符(Comparison Operators) 是指两个变量或者常量、表达式之间进行比较的运算符,如果比较关系成立,则表达式为真,返回值为1;反之,如果比较关系不成立,则表达式为假,返回值为0。 比较运算符及其涵义 | 符号 | 等价助记码 | 定 义 | 样 例 | = | EQ | 等于(EQual to) | a=3 | ^= ~= ¬= | NE | 不等于(Not Equal to) | a ne 3 或 a^=3 | > | GT | 大于(Greater Than) | num gt 5 | < | LT | 小于(Less Than) | num<8 | >= | GE | 大于或等于(Greater than or Eauql) | sales>=300 | <= | LE | 小于或等于(Less than or Equal) | sales<=100 | | IN | 等于列表中的一个(equal to one of list) | num in (3, 4, 5) |
比较运算符可以用于数字、字符和IN 操作符的比较。 (1)数字比较就是比较两个数值的大小。 (2)字符比较是用计算机的ASCII 码从左至右进行比较,编码顺序靠后的为大,如果第一个字母相同则比较第二字母,以此类推,缺失值或空格的比任何字母都小。例如,因为“.”比“h”小,所以表达式‘C. Jones'<‘Charles Jones'为真。 在字符比较中,拖尾的空格是被忽略的,所以’Fox ’=’Fox’为真,但是在字符开头和中间的空格不能被忽视,所以‘ Fox’<‘Fox’为真。 还可以在比较运算符后使用冒号(:)对字符串的特殊前缀进行比较,例如a=:‘T’,如果a 的第一个字母为T,则表达为真,否则为假。另外,一些函数可以搜索或选出字符串的值进行比较。 (3)在IN 操作符比较中,如果在IN 列表中的数字是连续+1 的整数,则可以用冒号(:)进行缩记。例如,表达式x in (1,2,3,4,5,6,7,8,9,10)可以缩记为x in (1:10),其涵义为如果x 等于其列表中1 到10 的任意一个数字,则表达式为真。同样,IN 比较运算符也可以用于字符串,例如,x in (‘NY’,‘NJ’, ‘PA’),如果x 为字符串‘NY'、‘NJ'、‘PA'中的任意一个,则表达式为真,否则为假。 注意:①有些比较运算符(如IN)不支持WHERE 子句和SQL 过程中;②当比较两个不同长度的常量或变量时,由于数值精度问题,可能得到不正确的结果。 3、逻辑(布尔)运算符(Logical or Boolean Operators) 逻辑运算符也称为布尔运算符,连接的表达式返回值为0 或1,常在表达式中表示比较关系。 逻辑或布尔运算符 | 符号 | 等价助记码 | 定义 | 举例 | & | AND | 逻辑且 | (a>b & c>d) | ! | ¦ | OR | 逻辑或 | (a>b or c>d) | ^ ~ ¬ | NOT | 逻辑非 | ^(a>b) |
(1)AND(逻辑且)运算符:如果AND 运算符连接的所有表达式为真,则整个表达式为真,否则为假。例如,表达式a<b & c>0,如果a<0 和c>0 都成立,则a<b & c>0 整个表达式为真;如果a<0 和c>0 有一个不成立,则整个表达式为假。如果AND 连接的表达式是同一个变量,则AND 可以省略。例如,16<=age and age<=65 中的AND 可以省略,记为16<=age<=65。 (2)OR(逻辑或)运算符:如果OR 运算符连接的所有表达式中有一个为真,则整个表达式为真,如果OR 连接的所有表达式为假,则整个表达式为假。例如,表达a<b | c>0,如果a<b 或者c>0 有一个是真,则整个表达式a<b | c>0 为真。 注意:在OR 运算符用于一连串的比较关系中(如在IF、SELECT、WHERE 语句中),非零或者非缺失值的常量总是被认为是真。例如,数值型常量2 总是为真,字符型常量‘TOM’总是为真,所以表达x=1 OR 2 中,x=1 和2 中有一个为真则整个表达式为真,2 为常量,总是为真,所以x=1 OR 2 也总是为真;而表达式x=1 OR x=2 的情况则不一样,需要x=1 或者x=2至少有一个成立,整个表达式才为真。 (3)NOT(逻辑非)运算符:NOT 是前缀逻辑运算符,其引导的表达式返回1(真)或者0(假),如果NOT 后的表达式为假,则NOT 引导的整个表达式为真,反之亦然。例如,如果x=y不成立,那么NOT(x=y)为真,返回值为1。前面说过,非零或者非缺失值的常量总是为真,也就是说零和缺失值为假,那么用NOT 引导缺失值或者0 的表达式为非假,即表达式为真。例如,NOT 0 的返回值为1。在一些表达式中NOT 相当于“不等于”,例如,表达not(name=‘SMITH’)和表达name~=‘SMITH’是等价的。 (4)德•摩根(DeMorgan)定律也适用于逻辑运算,即,非(P 且Q)=(非P)或(非Q),非(P 或Q)=(非P)且(非Q),SAS 表达式的形式就是, NOT (P AND Q)=(NOT P) OR (NOT Q) NOT (P OR Q)=(NOT P) AND (NOT Q) 这里的P 和Q 可以是变量、常量或表达式。 4、极大和极小运算符(MIN and MAX Operators) 极大运算符为<>,极小运算符为><,用于返回两个表达式的最大值或最小值。例如,如果A>B,则A<>B 的返回值为A,A><B 的返回值为B。如果比较的表达式中含有缺失值,则按缺失值的排序次序进行比较。 5、串联运算符(Concatenation Operator) 串联运算符为两个竖线(||),用于连结两个或多个字符串。例如,level=’grade’||’a”,则level的值为’gradea’。用两个竖线(||)联结两个或多个字符串的结果长度,是这几个字符串长度之和,并且串联运算符||不会自动整理字符前后的空格。 【例】用串联运算符对字符串进行串联。 - DATA SASTJFX48_7;
- LENGTH color name $8 game $12;
- color=‘black’;
- name=‘jack’;
- game=color||name;
- PUT game=;
- RUN;
复制代码在日志窗口PUT 语句输出的结果是“black jack”,因为color 占用5 个字节,但LENGTH语句规定color 的长度为8 个字节,所以color 后有3 个空格;同理用||串联“Mr. ”(其后有一个空格)和“Jones”,其结果为“Mr. Jones”。如果需要除去这种空格,可以使用TRIM()函数,例如把上面程序中的相关语句换为“game=trim(color||name);”,则日志窗口输出结果为“blackjack”。 6、运算次序 SAS 表达式可能同时含有多种、多个操作符和操作数,各种操作符的执行优先级顺序规定如下: 规则1:括号内优先。如不清楚操作符执行优先顺序可使用括号强制优先某些操作; 规则2:具有较高优先级的操作先执行,优先级次序如下: 组1:**,+(正号),-(负号),NOT,><,<>; 组2:*,/; 组3:+(加号),-(减号); 组4:||,¦¦,!!; 组5:<,<=,=,~=,>=,>,IN; 组6:AND,&; 组7:OR,|,¦,!; 规则3:具有相同优先级的操作依从左到右的原则。 特殊情况如下: (1)如果有多个连续求幂运算符,则从右至左计算。例如,x**y**z 等同于x**(y**z)。 (2)+、-可以指前缀运算符正号、负号,也可以指算术运算符加号、减号,当作为前缀运算符时,它出现在表达式的前面,或者紧跟一个左括号或其他符号。 (3)根据键盘布局,NOT 符号可以是“¬”、“~”、或“^”,并且可以用charcode 选项用其他未使用的符号来代替它。 (4)如果组1 中的正负号和极大、极小运算符同时出现,则从右至左计算。例如,-3><-3相当于-(3><-3),其值等于-(-3)即+3。 (5)根据键盘布局,串联运算符可以是“||”、“¦¦”或“!!”;同理,逻辑运算符OR 可以写成“|”、“¦”、“!”。 |