【问题标题】:within proc sql replace string of a macro variable在proc sql中替换宏变量的字符串
【发布时间】:2014-09-12 15:36:55
【问题描述】:

在 Proc SQL 中,我想使用宏变量&condition3,但我想将宏变量中的字符串“t1”替换为“t6”。如何使以下公式起作用:translate(&condition3,'T6','T1')

顺便说一句,&condition3 解析为:and t1.store in ('1234')

完整的查询:

Proc sql;
  Create table xxx as
    Select....
      From ...
      Where condition1
        And condition 2
        &condition3 

【问题讨论】:

  • 乔,非常感谢您的及时回复!在日志中:&condition3 解析为:和 T1.STR_SITE_NUM in ("1542") 但在 %sysfunc 中它解析为:和 T6.STR_SITE_NUM in ("6542") 你知道为什么 1542 解析为 6542 吗?它不会像那样直接工作,我必须将 %sysfunc(translate(&condition3,t6,t1)) 放在 condition2 之后的宏中。再次感谢!稍后我会尝试你的宏示例。
  • 因为“翻译”不正确...将更新答案。将来,如果您的评论是针对答案的,请对答案发表评论。
  • @Joe 我想在那里尝试您的宏示例,但是如何转换我的宏变量?我最初从互联网上获得了以下代码。 'Str' 是用户提示输入。
    %global STR_COUNT STR; %让 STR_WHERE_CLAUSE=;数据 <i>null</i>; /*Data whereclause;*/ if missing(symget('str'))=0 then do;长度STR_LIST $1000; STR1=symget('STR'); STR2=put(输入(STR1,best4.),z4.); STR_LIST=报价(STR2);把STR_LIST;结尾;如果缺少(STR_LIST)=0,则调用 symputx('STR_WHERE_CLAUSE',cats(' and T1.STR_SITE_NUM in (',STR_LIST,')'));跑; %PUT &amp;STR_Where_Clause;
  • @Joe 我在下面的链接中打开了另一个问题线程。谢谢! stackoverflow.com/questions/25852859/…

标签: sas sas-macro proc-sql


【解决方案1】:

您可能希望使用%SYSFUNC 宏语句。

%sysfunc(tranwrd(&condition3,t1,t6))

您可以直接使用它,即无需将其分配给另一个宏变量。您在 PROC SQL 中使用它的事实是无关紧要的,因为您只是在创建要传递给(任何东西)的文本。

也就是说,您可能要考虑在此处使用宏而不是宏变量;如果是这样会更合乎逻辑

%macro condition3(table=);
  and &table..store in ('1234')
%mend condition3;

那么你就可以像使用宏变量一样在 SQL 中使用宏了。

where condition1
  and condition2
  %condition3(table=t6)

【讨论】:

  • 已更新。请注意参数的反转:Translate 具有 to, fromtranwrd 具有 from, to
  • 我相信我使用了正确的翻译,因为 &condition4 和 5 可以按照我想要的方式运行。它只是数字(“1542”)以某种方式更改为(“6542”)。对此有什么想法吗?
  • 因为您使用了错误的翻译。 TRANSLATE 将第一个列表中的任何字符转换为第二个列表中的相应字符。 TRANWRD 需要 all 个字符,全部按此顺序。所以translate(var,'t6','t1') 把所有的 1 变成了 6,把所有的 ts 变成了 ts。 tranwrd(var,'t1','t6') 将所有 t1 仅转换为 t6
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
相关资源
最近更新 更多