如果没有找到记录,如何将SAS中的空值输入变量

how to enter empty value in SAS into variable if no records were found

我正在使用 SAS,我正在从数据集中获取值并将它们保存在 SAS 中到变量中。

示例数据:

table
RK | ID | column_1 | column_2
1  | one| value_1  |  
2  | two| value_1  |  value_2

proc sql noprint;

select column_1 
into: variable_1
from table
where RK = 1;

select column_2
into: variable_2
from table
where RK = 1;

quit;

现在我想在我的报告中使用这些变量,如果我的变量中没有数据,我想打印一个空白 space。作为

%put &variable_1;
%put &variable_2;

结果

value_1
&variable_2

如果我的 into 变量中没有值,我希望它只打印一个空白 space 到我的日志或报告中。

我该怎么做?

预期结果

value_1
(A blank space)

试试这个:

proc sql noprint;

select case when column_1 is null then " " else column_1 end 
into: variable_1
from table
where RK = 1;

select case when column_2 is null then " " else column_2 end 
into: variable_2
from table
where RK = 1;

quit;


%put &variable_1;
%put &variable_2;

使用coalescec:

proc sql noprint;

select coalesecec(column_1," ") 
into: variable_1
from table
where RK = 1;

select coalesecec(column_2," ") 
into: variable_2
from table
where RK = 1;

quit;
%let variable_1=;
%let variable_2=;

proc sql noprint;

select column_1 
into: variable_1
from table
where RK = 1;

select column_2
into: variable_2
from table
where RK = 1;

quit;

如果 select 语句没有 return 任何行(空源 table 或没有行匹配 where 条件)那么 [=13] 中命名的宏变量=] 子句未创建。只需使用 %let 语句在 运行 和 select 语句之前设置默认值。

proc sql noprint ;
%let infant_list=;
select name
  into :infant_list separated by ' '
  from sashelp.class 
  where age < 5 
;
quit;
%put &=infant_list;

如果您真的希望宏变量包含一个 space 而不是什么都没有,那么您将需要使用宏引用。

%let infant_list=%str( );

日志

命名宏值记录是一种快捷语法

%put &=variable_1; /* is almost the same as */
%put variable_1=&variable_1;

如果 variable_1 包含未加引号的分号或其他混淆的程序段,最好使用 superq 进行记录。通过将值解析括起来,宏变量也可以在日志中更清楚地显示。这将使您看到前导和尾随 spaces.

%put NOTE: variable_1=[%superq(variable_1)];

进入

您可以 select 在 INTO 子句中指定多个变量

select a, b
into :a, :b

基本INTO形式没有trim值,目标(宏变量)值长度基于源变量、计算长度或select指定的长度项目 length= 选项。

select a length=50, substr(b,1,2)
into :a_50, :b_2

/* length of macro variable 'variable_1' will be the same length as column_1,
   regardless of the " ".  If the string literal was longer than column_1,
   the computation length is the string literals length.
*/
select case when column_1 is null then " " else column_1 end 
into: variable_1

INTO 个目标有额外的语法和关键字

  • trimmed 值到宏变量
    select A INTO :A trimmed
  • trim从多行到多个(范围)宏变量的中间值
    select A INTO :A1-A99 /* 填充 &SQLOBS 宏变量的范围,如果 <99 */
  • trim从多行到单个宏变量的med值
    select A INTO :A_csv separated by ','

注意:传输到宏的 trimmed 空白值变为零长度字符串。 注意:SAS 数据集中的字符 null 是空白值,因此您不一定需要 CASEcoalesce

variable_1的空白情况可能是

select column_1 into: variable_1
select column_1 into: variable_1 trimmed
--- LOG ---
NOTE: variable_1=[            ];
NOTE: variable_1=[];

我推测宏变量值的长度是在SQL语句compilation/planning期间确定的,在执行期间不能改变(意味着目标长度不会根据找到的值)

案例 1 - 没有行 selected

whereselect没有行时,INTO子句就没有理由运行,因此也不会创建宏变量。如果宏变量在查询之前已经存在,则其值将保持不变。因此,您应该在查询之前初始化 INTO 子句中列出的每个宏变量(根据 Azeem112)。

%let variable_1=;
%let variable_2=;

proc sql noprint;

如果你真的需要一个space,而不是什么都不需要,就这样初始化

%let variable_1=%str( );
%let variable_2=%str( );

proc sql noprint;

案例 2 - 行 selected

来自 selected 项目的值被移动到一个宏变量中。宏值具有与项目相同的 untrimmed 长度,或者如果 trimmed 则为项目的长度,或者如果项目是空白值则为 0。如果您需要在宏变量中为空值情况使用单个 space,您可以执行

select column_1 into: variable_1 trimmed
...;
%let variable_1 = %qsysfunc(ifc(%length(%superq(variable_1)),%superq(variable_1),%str( )));