SAS 编程技巧 - PROC SQL(五)
上一节,我们提到了 CASE 表达式在 PROC SQL 中的应用。事实上,PROC SQL 支持更为一般的 SQL 表达式。
表达式的结构
SQL 表达式由操作数(operand)和操作符(operator)组成。
操作数可以是以下任意一种:
- 常量
- 变量
- CASE 表达式
- 任何受支持的 SAS 函数
- 任何使用 PROC FCMP 创建的函数(含数组参数的函数除外)
- 聚集函数
- 查询表达式
操作符可以是以下任意一种:
- 算数运算符
- 逻辑运算符
- 比较运算符
- 子集运算符
- 其他算符
操作符必须与至少一个操作数同时使用才有意义。根据操作符需要的操作数的数量,有一元操作符、二元操作符等。SAS 根据操作符的运算优先级对表达式进行求值,求值结果作为查询的结果。可以使用括号改变表达式运算的顺序,这使得我们不必记住所有操作符的运算优先级,当不确定某个表达式的运算顺序时,使用括号显式指明运算顺序即可。
proc sql;
select
MONOTONIC() as seq label = "序号",
name,
sex,
age,
WEIGHT,
WEIGHTU,
HEIGHT,
HEIGHTU,
((WEIGHTU = "pound") * (WEIGHT * 0.4536) + (WEIGHTU = "kg") * WEIGHT) /
((HEIGHTU = "inch") * (HEIGHT * 0.0254) + (HEIGHTU = "m") * HEIGHT) ** 2
as BMI1 label = "BMI1(kg/m^2)" format = 8.2,
(case when WEIGHTU = "pound" then WEIGHT * 0.4536 else WEIGHT end) /
(case when HEIGHTU = "inch" then HEIGHT * 0.0254 else HEIGHT end) ** 2
as BMI1 label = "BMI2(kg/m^2)" format = 8.2
from class;
quit;
上述例子中,变量 BMI1 和 BMI2 作为查询结果的别名,存储了体重指数的计算结果。虽然使用了不同的表达式进行计算,但得到的结果却完全一致,可谓是殊途同归。
💡 计算 BMI1 变量的表达式中,使用了逻辑运算符 =
。逻辑表达式的计算结果通常是一个布尔值,在 SAS 中,若表达式结果为 “真”,则运算结果为 1,若为 “假” ,则运算结果为 0。这一特性使得我们可以将逻辑表达式嵌套在算数表达式中,更进一步地说,这其实可以看成指示函数的一种形式(Indicator function)。
💡 计算 BMI2 变量的表达式中,使用了 CASE 表达式的运算结果作为算数表达式 /
的两个操作数