在日常的編程中,為了方便調(diào)用某些值,一個(gè)簡便的方法是將這些值賦值到宏變量中。給宏變量賦值,Data步和Proc步都能可以實(shí)現(xiàn),不過從操作靈活性上講,Proc步要更勝一籌。Proc步生成宏變量就需要用到INTO子句,下面來具體介紹一下INTO子句如何使用。
INTO子句的作用是,將PROC SQL生成的值賦值給宏變量。
語法
我們來看一下INTO子句的具體語法:
INTO : macro-variable-specification-1 <, : macro-variable-specification-2 ...>
macro-variable-specification,宏變量的說明,是要?jiǎng)?chuàng)建的一個(gè)或多個(gè)宏變量的名稱,并且在每個(gè)宏變量名稱前都需要添加一個(gè)冒號(hào):。如果不添加冒號(hào),程序運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。
macro-variable-specification的形式
INTO語句宏變量的命名有3種形式:
- into : macro-variable(指定一個(gè)或多個(gè)宏變量)
- into : macro-variable-1 ? : macro-variable-n <NOTRIM> (指定一個(gè)宏變量序列)
- into : macro-variable SEPARATED BY 'characters ' <NOTRIM> (指定一個(gè)宏變量來保存一列的所有值)
下面我來介紹每種方式的語法和具體的代碼示例,使用的示例數(shù)據(jù)集是SASHELP.BASEBALL, 為了方便演示,我只選取數(shù)據(jù)集前4行的記錄,先看一下數(shù)據(jù)集具體的內(nèi)容:
data baseball;
set sashelp.baseball (obs =4);
run;

下面具體看每一種命名方式:
1、指定一個(gè)或多個(gè)宏變量(into : macro-variable)
使用這種命名方式,賦值給宏變量的值的前置和后置空格都會(huì)被保留。如果想要移除前置或后置空格,需要自行對(duì)所引用的值進(jìn)行函數(shù)處理。如果要命名多個(gè)宏變量,各個(gè)宏變量名稱之前都需要添加冒號(hào):,并且名稱之前都要有逗號(hào),間隔。同時(shí),也要注意,這種命名方式只是選取變量的一條記錄賦值給宏變量。如果所選變量有多條記錄,并且不經(jīng)過篩選的話,默認(rèn)是選取第一條記錄進(jìn)行賦值。
賦值代碼示例:
proc sql noprint;
select name, team
into :name, :team
from baseball;
quit;
%put &name;
%put &team;
宏變量的值如下:


從結(jié)果中,我們可以看到,變量name、team的第一條記錄都被賦值到宏變量中了。
2、指定一個(gè)宏變量序列(into : macro-variable-1 ? : macro-variable-n <NOTRIM>)
使用這種命名方式,賦值給宏變量的值的前置和后置空格都會(huì)被自動(dòng)移除。如果項(xiàng)目要保留值的前置和后置空格,就需要在每個(gè)元素后面添加NOTRIM選項(xiàng)。如果有多個(gè)元素存在,只需要對(duì)需要保留空格的那個(gè)元素使用NOTRIM選項(xiàng)。序列中有多少數(shù)目的宏變量名,就會(huì)有同樣數(shù)目的變量記錄賦值到對(duì)應(yīng)宏變量中。
賦值代碼示例:
proc sql noprint;
select name, team
into :name1- :name4 notrim, :team1 - :team3
from baseball;
quit;
考慮到有多個(gè)宏變量,我們利用SAS字典的值來查看宏變量的值:
%symdel name team;
proc sql noprint;
create table test as
select *
from dictionary.macros
where index(name, "NAME") or index(name, "TEAM")
;
quit;
輸出結(jié)果如下:

當(dāng)用宏變量序列來保存變量的值時(shí),可以保存多個(gè)變量值。
3、指定一個(gè)宏變量來保存一列的所有值(into : macro-variable SEPARATED BY 'characters ' <NOTRIM>)
使用這種命名方式,列表中的值將會(huì)被一個(gè)或多個(gè)字符分隔。賦值給宏變量的值的前置和后置空格都會(huì)被自動(dòng)移除。如果項(xiàng)目要保留值的前置和后置空格,也還是需要使用NOTRIM選項(xiàng)。
這種命名方式便于建立一項(xiàng)事物的集合,比如,實(shí)現(xiàn)變量可能取值的匯總:
proc sql noprint;
select distinct name
into :names separated by ','
from baseball;
quit;
%put &names;
宏變量的值如下:

再比如,建立批量命名語句:
proc sql noprint;
select strip(name)||" = "||strip(name)||"_new" into :rename separated by " "
from dictionary.columns
where libname="WORK" and memname="BASEBALL";
quit;
%put &rename.;
data baseball_new;
set baseball;
rename &rename.;
run;


再比如,只保留數(shù)據(jù)集中字符型變量:
proc sql noprint;
select name into :keepnames separated by " "
from dictionary.columns
where libname="WORK" and memname="BASEBALL" and type="char";
quit;
%put &keepnames.;
data baseball1;
set baseball;
keep &keepnames.;
run;


熟悉INTO子句的用法后,可以根據(jù)根據(jù)任務(wù)的需求自由發(fā)揮。
以上。
若有疑問,歡迎評(píng)論區(qū)交流!