【问题标题】:Remove single quotes in list of values in macro variable删除宏变量值列表中的单引号
【发布时间】:2019-11-19 04:59:47
【问题描述】:

我有一个包含多个程序的项目。每个程序都有一个 proc SQL 语句,它将为 WHERE 子句中的条件使用相同的值列表;但是,需要的一个数据库表的列类型是字符类型,而另一个数据库表的列类型是数字。

所以我有一个“客户端 ID”值列表,我想将这些值放入宏变量中,因为这些 ID 可以更改,我想在变量中更改一次,而不是在多个程序中更改。

例如,我像这样设置了这个宏变量,它在查询字符列的 proc SQL 中工作: %let CLNT_ID_STR = ('179966', '200829', '201104', '211828', '264138');

Proc SQL 部分: ...IN &CLNT_ID_STR.

我想创建另一个宏变量,例如 CLNT_ID_NUM,它采用第一个变量 (CLNT_ID_STR) 但删除引号。

所需输出:(179966, 200829, 201104, 211828, 264138)

Proc SQL 部分:...IN &CLNT_ID_NUM.

我尝试过使用sysfuncdequotetranslate 函数,但没有弄明白。

【问题讨论】:

    标签: sas


    【解决方案1】:

    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() 来掩盖单引号的含义。

    【讨论】:

    • 这满足了我的需求。谢谢!
    【解决方案2】:

    另外三种去除单引号的方法是COMPRESSTRANSLATEPRXCHANGE

    %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 用一个空格 () 替换 ' 并不重要,因为解释的上下文是数字。

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 1970-01-01
      • 2013-08-21
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多