SAS 编程技巧 - PROC SQL(五)

发布时间 2023-08-11 16:53:18作者: Snoopy1866

上一节,我们提到了 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 表达式的运算结果作为算数表达式 / 的两个操作数