SAS编程:SQL中的条件语句——Case表达式

在日常的SAS编程工作中,使用最多的条件判句是Data步中的if then语句,今天介绍一下SQL中的条件语句Case表达式。实话实说,这是我第一次在工作中使用SQL中的条件语句。从刚接触SAS开始,Data步中if then就是我条件判断的首选,因为它语法简单,容易理解。

那为什么我这次选择了使用SQL中的Case表达式呢?编程中,我们应该都有这样的体会,SQL对于数据集的拼接处理比较高效简洁;但对于新建变量、变量处理方面,Data步处理就比较简洁。最近,我用SQL语句处理好数据集的复杂拼接后,需要根据一个判断条件的真假去生成以一个新变量。按照习惯,我会再写一个Data步实现这个操作。但是,当时觉得仅仅为这个变量多写一个Data步,程序显得“臃肿”。于是,我去查看SQL的说明文档,直接在SQL中用Case表达式进行处理了。

语法

Case表达式的作用是,选择满足指定条件的结果值。不多说,直接看语法:

Case语法

表达式必须的参数是判断条件(when-condition)结果表达式(result-expression),可选参数是Case表达式操作对象(case-operand)

先介绍操作对象(case-operand)参数,它是一个有效的SQL表达式,会解析为表的一列,其值会与所有的判断条件(when-conditions)进行比较。判断条件(when-condition) 参数分两种情况,当指定操作对象(case-operand)时,when-condition是一个缩短的SQL表达式(作为判断操作符 = 的右边值),它假定case-operand为其操作数之一(作为判断操作符 = 的左边值),并解析为true或false;当不指定操作对象(case-operand)时,when-condition是解析为true或false的SQL表达式。结果表达式(result-expression)参数,是解析为一个值的SQL表达式。

代码示例

单看参数的解释说明,不太容易理解,我来用代码演示讲解。代码的实现目标是,在SASHELP.Class数据集中,根据SEX的值,新建一个变量SEX_,映射关系是'F'->'Female', 'M'->'Male'。

在置空可选参数的情况下,示例代码如下:

proc sql noprint;
  create table class as
    select *, case 
      when sex="F" then "Female"
      when sex="M" then "Male"
      else "Other"
     end as sex_
    from sashelp.class;
quit;

输出结果如下:


Output 1

在有可选参数的情况下,示例代码如下:

proc sql noprint;
  create table class as
    select *, case  sex
      when "F" then "Female"
      when "M" then "Male"
      else "Other"
     end as sex_
    from sashelp.class;
quit;

输出结果与置空参数情况下相同,结合这两段代码,就容易理解Case表达式的语法了。

最后,提一个小点。在Data步中,如果没有指定新建变量的长度,默认是以第一行记录值的长度作为变量的长度,如果该记录值的长度不是该变量的最长值,那么后续记录值会发生截断。不过,在SQL的条件语句中,不会出现这种情况。SQL中新建变量的长度,默认是变量中最长值的长度。

以下是Data步的示例代码:

data class_a;
  set sashelp.class;
  if sex = "M" then sex_="Male";
  else if sex = "F" then sex_="Female";
  else sex_="Other";
run;

新建变量发生截断

Output 2

以下是SQL的示例代码:

proc sql noprint;
  create table class_b as
    select *, case  sex
      when "M" then "Male"
      when "F" then "Female"
      else "Other"
     end as sex_
    from sashelp.class;
quit;

SQL中新建变量没有发生截断

Output 3

以上。

若有疑问,欢迎评论区交流!

你可能感兴趣的:(SAS编程:SQL中的条件语句——Case表达式)