设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7439|回复: 0

SAS 运算符(SAS Operators)

[复制链接]

4

主题

47

金钱

72

积分

新手用户

发表于 2018-9-28 13:28:35 | 显示全部楼层 |阅读模式

运算符是表示算术、比较、逻辑等关系的特殊符号。根据其所在位置可分为:

  • 前缀运算符:即用于操作数前的运算符,如正号(+)、负号(-)等。
  • 中缀运算符:即用于操作数中间的运算符。

也可以根据其用途及用法分为:

  • 算术运算符
  • 比较运算符
  • 逻辑(或布尔)运算符
  • 极大或极小运算符
  • 串联运算符

1、算术运算符(Arithmetic Operators)

是指进行算术运算的符号。

算术运算符其及其涵义
符号定义样例结果
**求幂a**3a的3次方
*2*y2乘以y
/var/5Var除以5
+num+3Num加3
-sale-discountSale减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’。用两个竖线(||)联结两个或多个字符串的结果长度,是这几个字符串长度之和,并且串联运算符||不会自动整理字符前后的空格。

【例】用串联运算符对字符串进行串联。

  1. DATA SASTJFX48_7;
  2. LENGTH color name $8 game $12;
  3. color=‘black’;
  4. name=‘jack’;
  5. game=color||name;
  6. PUT game=;
  7. 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 可以写成“|”、“¦”、“!”。

本帖被以下淘专辑推荐:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表