【问题标题】:SAS Macro Variable having commas to be converted to single quotes with commas具有逗号的 SAS 宏变量要转换为带逗号的单引号
【发布时间】:2015-12-03 05:56:11
【问题描述】:

有人可以帮助我如何使用单引号更新宏变量。

我从如下数据集中以逗号分隔值的形式获取数字:

2108008080、2108008081、2108888082、2108858090、213856345等 我必须在 SQL where 条件中将这些记录中的每一个作为 Phone_numbers in (&current_macro_variable) 传递。为此,我必须在每个值周围添加单引号,因为 Phone_numbers 列是 Oracle DB 的字符字段。

非常感谢任何帮助。我无法从 SAS 社区获得太多帮助。

【问题讨论】:

  • 你是如何获得逗号分隔的列表的?在这个阶段添加引号很可能是最容易的
  • 你不使用双引号的原因是什么?那么解决方案就很简单了:%let macroQuoted = "%sysfunc(tranwrd(%str(&macroVar),%str(, ),%str(", ")))";
  • 我在 SAS 社区中找不到您的问题,请问您在哪里发布了它?
  • @DirkHorsten 鉴于已解释的用例,我猜这将被传递给只需要单引号的 SQL 框。
  • 是的,乔。汤姆的回答帮助了我。我昨天在我的 CATQ 函数中尝试了 1C,但没有尝试 1aC

标签: sas sas-macro


【解决方案1】:

使用PROC SQLselect ... into 语法:

/* 建立以逗号分隔的引用电话号码列表 */ 过程 sql ; 选择cats("'",phone_number,"'") 到:PHONELIST 中,用','分隔 来自电话数据; 辞职 ; /* 然后将它传递给您的 Oracle 查询... */ 过程 sql ; 选择变量 来自 ora.table 其中电话输入(&PHONELIST); 辞职 ;

【讨论】:

    【解决方案2】:

    您尝试过CATQ() 功能吗?使用1 修饰符生成单引号。使用a 修饰符来引用所有术语。使用c 修饰符生成逗号作为输出分隔符。

    %let x=2108008080, 2108008081, 2108888082, 2108858090, 213856345;
    %put %sysfunc(catq(1ac,&x));
    

    产生:

    '2108008080','2108008081','2108888082','2108858090','213856345'
    

    【讨论】:

    • 感谢汤姆的帮助
    • 汤姆,还有一个问题与我的想法相同。我的实际宏变量是 %let x="2108008080", "2108008081", "2108888082", "2108858090", "213856345";当我编写类似以下数据 null 的代码时; out_str=catq('C1',&x);放出_str; ;跑; 2108008080, 2108008081, 2108888082, 2108858090, 213856345 这是输出 CATQ 如何抑制双引号。当我在没有 NUL 步骤的情况下在 %SYSFUNC 中使用相同的函数 CATQ 时,这不是输出。这怎么可能?
    • 您需要使用 A 修饰符来获取所有单独引用的项目。但真正的区别在于,对于宏处理器来说,引号是字符串的一部分。在数据步骤中,需要引号让 SAS 知道该值是字符串文字而不是数字、另一个变量的名称或表达式。在宏中,一切都是字符串,因此引号成为值的一部分。所以你最终得到'"2108008080"'
    【解决方案3】:

    quote 函数应该可以解决问题。 您必须遍历 stringLine 中的所有单词并添加引号。

    %let macroVar = %str(2108008080, 2108008081, 2108888082, 2108858090, 213856345);
    
    data _null_;
        n = count("&macroVar",",");
        length 
            quotedword $2000.;
        quotedword = "";
        do i = 1 to n+1;
            word = scan("&macroVar",i,",");
            y = quote(compress(word));
            quotedword = strip(quotedword) || "," || strip(y);
        end;
        quotedword = substr(quotedword,2); /* removing first comma from beginning */
        call symputx("macroVarUpdated",quotedword);
    run;
    
    %put &macroVar;
    %put &macroVarUpdated;
    

    【讨论】:

    • QUOTE 双引号,而不是单引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多