如果没有找到记录,如何将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 是空白值,因此您不一定需要 CASE
或 coalesce
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
当where
select没有行时,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( )));
我正在使用 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 是空白值,因此您不一定需要 CASE
或 coalesce
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
当where
select没有行时,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( )));