【问题标题】:How can I create a dynamic where clause in a SAS Proc Sql statement?如何在 SAS Proc Sql 语句中创建动态 where 子句?
【发布时间】:2016-07-07 18:13:25
【问题描述】:

我想创建以下 Proc SQL 语句:

%macro query(from_table, return_table, variable);

Proc sql;
    create table &return_table as
        select
        *
    from &from_table
    where &variable contains " 0000 "
    or &variable contains " 3023 "
    or &variable contains " 9999 "
    or &variable contains " 5555 "
    ...
    ;
run;

%mend;

我有一个包含 400 个 4 位代码观察值的数据文件。如何遍历数据文件并创建自定义 where 子句。我不想输入"or &variable contains " xxxx " " 400 次。

我正在考虑使用另一个宏来创建一个带有 do 循环的文本变量,以遍历 400 个观察值,但似乎无法让它发挥作用。我想要类似的东西

%macro append_string(table);
    %Let string = ;
    %Do I=1 %To 400;
       %Let string = &string cat("or variable contains" , table[I]);
    %end;
%mend;

解决这个问题的正确方法是什么?我试过用很多不同的方式编写 append_string 宏,但没有任何效果。

【问题讨论】:

  • 我有一个包含 400 个 4 位代码观察值的数据文件...那么为什么要在 WHERE 子句中包含所有 400 个代码?一般WHERE作为子集的过滤器,

标签: sql sas sas-macro


【解决方案1】:

您可以使用exists 查询相当容易地做到这一点:

data substrings;
input substring $;
datalines;
1234
5678
9012
;;;;
run;

data master_file;
input @1 full_String $15.;
datalines;
1234 58328 2148
9485 12345 9845
9012 19484 1234
5678 56789 9019
9999 99999 9999
;;;;
run;

proc sql;
  select * from master_file M
    where exists (
      select 1 from substrings S
      where findw(M.full_string, trim(S.substring))
      )
    ;
quit;

要用空白替换单词,您可以使用连接 - 我在这里使用左连接,内连接只会返回匹配的行,左连接会返回只编辑匹配行的所有行(这也显示匹配的字符串) :

proc sql;
  select M.full_string, S.substring, tranwrd(M.full_string,trim(S.substring),' ')
  from master_file M
       left join substrings S
       on findw(M.full_String,trim(s.substring))
  ;
quit;

这实际上并不寻找空格分隔符,但您的评论表明您可能不需要它在那里。否则,您可以通过串联将其添加回来。

另外,请注意,如果匹配多个字符串,这不一定能达到您想要的效果。将第四行从 5678 更改为 1234,它只会更改 1234 - 这样每行只能进行一次匹配。进行多个匹配将是一个非常不同的操作。

【讨论】:

  • 哇!我认为这可能只是工作!我怎样才能在 proc sql 结果中添加另一列,告诉我在每个 full_string 观察中找到了哪些子字符串数据行?
  • 另一个问题,如何在同一个 proc sql 结果中创建另一列,该列等于 full_string 观察结果,发现子字符串被删除。例如。 sql结果:58328 2148 9485 5 9845
  • 您可能希望将这些内容编辑到问题中 - 这样,如果其他人给您其他答案,他们也会将这些内容包括在内。
  • 谢谢!我还想弄清楚如何在我的问题中进行多个匹配 [stackoverflow.com/q/38254361/6562098] 你能解释一下我该怎么做吗?
  • @JennyCai 通常每个帖子只有一个问题,其他问题应该在新问题中发布,否则帖子会变得笨拙,对未来的用户没有用处。如果这回答了您最初的问题,请务必将其标记为已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2021-01-28
相关资源
最近更新 更多