Sas 删除宏变量值列表中的单引号
我有一个包含多个程序的项目。每个程序都有一个proc SQL语句,该语句将在WHERE子句中的条件中使用相同的值列表;但是,所需的一个数据库表的列类型是字符类型,而另一个数据库表的列类型是数字类型 因此,我有一个“客户机ID”值列表,我希望将其放入宏变量中,因为这些ID可以更改,我希望在变量中更改一次,而不是在多个程序中更改 例如,我这样设置了这个宏变量,它在proc SQL中工作,proc SQL查询字符列:Sas 删除宏变量值列表中的单引号,sas,Sas,我有一个包含多个程序的项目。每个程序都有一个proc SQL语句,该语句将在WHERE子句中的条件中使用相同的值列表;但是,所需的一个数据库表的列类型是字符类型,而另一个数据库表的列类型是数字类型 因此,我有一个“客户机ID”值列表,我希望将其放入宏变量中,因为这些ID可以更改,我希望在变量中更改一次,而不是在多个程序中更改 例如,我这样设置了这个宏变量,它在proc SQL中工作,proc SQL查询字符列: %let CLNT\u ID\u STR=('179966','200829','2
%let CLNT\u ID\u STR=('179966','200829','201104','211828','264138')代码>
过程SQL部分:
…在&CLNT\u ID\u STR.
我想创建另一个宏变量,比如CLNT_ID_NUM,它接受第一个变量(CLNT_ID_STR),但删除引号
所需输出:(1799662008292011042118282828282264138)
过程SQL部分:…IN&CLNT\u ID\u NUM.
我尝试过使用sysfunc
、dequote
和translate
函数,但还没有找到答案。translate似乎不希望允许使用空字符串作为替换
下面使用TRANSTRN,将单引号转换为null没有问题:
1 %let CLNT_ID_STR = ('179966', '200829', '201104', '211828', '264138');
2 %let want=%sysfunc(transtrn(&clnt_id_str,%str(%'),%str())) ;
3 %put &want ;
(179966, 200829, 201104, 211828, 264138)
它使用宏引号函数%str()来屏蔽单个引号的含义。TRANSLATE似乎不希望使用空字符串作为替换
下面使用TRANSTRN,将单引号转换为null没有问题:
1 %let CLNT_ID_STR = ('179966', '200829', '201104', '211828', '264138');
2 %let want=%sysfunc(transtrn(&clnt_id_str,%str(%'),%str())) ;
3 %put &want ;
(179966, 200829, 201104, 211828, 264138)
它使用宏引号函数%str()来屏蔽单个引号的含义。删除单个引号的其他三种方法是压缩
,翻译
和交换
%let CLNT_ID_STR = ('179966', '200829', '201104', '211828', '264138');
%let id_list_1 = %sysfunc(compress (&CLNT_ID_STR, %str(%')));
%let id_list_2 = %sysfunc(translate(&CLNT_ID_STR, %str( ), %str(%')));
%let id_list_3 = %sysfunc(prxchange(%str(s/%'//), -1, &CLNT_ID_STR));
%put &=id_list_1;
%put &=id_list_2;
%put &=id_list_3;
----- LOG -----
ID_LIST_1=(179966, 200829, 201104, 211828, 264138)
ID_LIST_2=( 179966 , 200829 , 201104 , 211828 , 264138 )
ID_LIST_3=(179966, 200829, 201104, 211828, 264138)
TRANSLATE
用一个空格(
)替换
)实际上并不重要,因为解释的上下文是数字的。删除单引号的其他三种方法是压缩
,TRANSLATE
和PRXCHANGE
%let CLNT_ID_STR = ('179966', '200829', '201104', '211828', '264138');
%let id_list_1 = %sysfunc(compress (&CLNT_ID_STR, %str(%')));
%let id_list_2 = %sysfunc(translate(&CLNT_ID_STR, %str( ), %str(%')));
%let id_list_3 = %sysfunc(prxchange(%str(s/%'//), -1, &CLNT_ID_STR));
%put &=id_list_1;
%put &=id_list_2;
%put &=id_list_3;
----- LOG -----
ID_LIST_1=(179966, 200829, 201104, 211828, 264138)
ID_LIST_2=( 179966 , 200829 , 201104 , 211828 , 264138 )
ID_LIST_3=(179966, 200829, 201104, 211828, 264138)
用一个空格(
)替换'
)实际上并不重要,因为解释的上下文是数字的。这满足了我的需要。非常感谢。这满足了我的需要。非常感谢。