SAS 编程技巧 - PROC SQL(四)

发布时间 2023-08-02 21:46:38作者: Snoopy1866

上一节,我们介绍了使用 SELECT 语句对变量进行查询,这一节我们继续介绍 SELECT 的简单查询操作。

常量

常量包括数值常量和字符串常量,有时候也被称为字面量(literal)。

proc sql noprint;
    create table ADSL as
        select
            "TEST-CLINICAL-TRIAL-2023-0012" as STUDYID,
            USUBJID,
            SITEID,
            SEX,
            AGE
        from DM;
quit;

上述代码中,在查询语句中使用了常量 "TEST-CLINICAL-TRIAL-2023-0012",查询结果存储在新创建的数据集 ADSL 中。ADSL 包括数据集 DM 中的 4 个变量,以及使用常量定义的一个变量 STUDYID。

? 使用关键字 AS 可以为未命名的变量指定一个变量名(又称别名),便于后续引用。若查询结果仅仅是为了展示,可以不定义别名;若查询结果将存储在数据集中,则应当指定一个别名,否则 SAS 将自动指定一个变量名(根据查询类型,可以是 _TEMAxxx 或 _TEMGxxx)。基于代码可读性的考虑,依赖 SAS 的自动命名机制是不可取的,在创建数据集的任何时候都应当手动指定变量名。

CASE 表达式

CASE 表达式用于按照条件分支进行查询。

proc sql noprint;
    select
        USUBJID,
        SITEID,
        SEX
        (case SEX
            when "F" then "男"
            when "M" then "女"
        end) as SEXC
    from DM;
quit;

上述代码使用 CASE 表达式根据变量 SEX 的值衍生新的变量 SEXC,对于某一条观测,其变量 SEX 的值都会与指定的 WHEN 条件进行比较,直到符合某一条 WHEN 条件,此时将 THEN 后面的结果作为查询结果赋值给变量 SEXC。

CASE 表达式还有另一种写法,可以不在 CASE 后面指定变量名,但是在 WHEN 后面指定具体的条件,上述代码可以改写为:

proc sql;
    select
        USUBJID,
        SITEID,
        SEX
        (case
            when SEX = "F" then "男"
            when SEX = "M" then "女"
        end) as SEXC
    from DM;
quit;

? 这两种写法的区别是:第一种适用于要执行比较的是固定的变量的情况,第二种适用于要执行的比较涉及到多个变量的情况。

例如,下面的例子就只能使用 CASE 表达式的第二种写法:

proc sql;
    select
        USUBJID,
        SITEID,
        SEX
        (case
            when CMSTDT <  TRTDT then "既往用药"
            when CMSTDT >= TRTDT then "合并用药"
        end) as CMSCAT
    from DM;
quit;

通常,CASE 表达式还可以使用 ELSE 关键字指定一条 “兜底” 的查询结果,当所有 WHEN 条件都不匹配时,将返回 ELSE 表达式结果。

proc sql;
    select
        USUBJID,
        SITEID,
        (case when HEIGHTU = "m" then HEIGHT/WEIGHT**2
              when HEIGHTU = "cm" then HEIGHT/100/WEIGHT**2
              else "ERROR: 身高单位错误"
        end) as BMI
    from DM;
quit;

函数