SAS SQL:WHERE LIKE'单词列表'

时间:2016-05-06 20:03:21

标签: sql sas

我有一个数据集,其中包含一些排除主题的注释。我想制作一个迷你数据集来收集这些主题。

我正在尝试使用SAS SQL,所以我尝试这样做:

  PROC SQL;
         CREATE TABLE EXCLUDE as
         SELECT *
         FROM data_set
         WHERE UPCASE(COMMENT) like '%(INELIGIBLE | REFUSED)%';
 QUIT;

我也试过

 PROC SQL;
    CREATE TABLE exclude as
    SELECT *
     FROM Data_set
        WHERE UPCASE(COMMENT) like ('%INELIGIBLE%'|'%REFUSED%')
    ;
 QUIT;

我一直收到一条错误,上面写着“喜欢操作员需要字符操作数”

如何才能使其成为正确的语法查询?

由于

4 个答案:

答案 0 :(得分:4)

您可以通过like-join对要排除的字词列表执行此操作:

data words ;
  input word $char16. ;
datalines ;
INELIGABLE
REFUSED
;
run ;

proc sql ;
  create table exclude as
  select a.*
  from data_set a
       left join
       words b on upcase(a.comment) like cats('%',b.word,'%')
  where missing(b.word) ;
quit ;

答案 1 :(得分:2)

如果您正在处理已经形成的字符串,则可以使用perl正则表达式执行此操作。 (如果没有,你最好只编写单独的语法,PRX很慢。)

这里的等效代码,一个写出,一个使用单个字符串的PRX:

proc sql;
  select * 
  from sashelp.class
  where not (name like 'A%' or name like 'B%');
quit;


proc sql;
  select * 
  from sashelp.class
  where not (prxmatch('~^[A|B]~io',name));
quit;

答案 2 :(得分:2)

SQL没有完整的正则表达式支持。在SAS中,您可以使用prxmatch()。但是,您也可以在SQL中执行此操作:

  PROC SQL;
     CREATE TABLE EXCLUDE as
         SELECT *
         FROM data_set
         WHERE UPCASE(COMMENT) like '%INELIGIBLE%' OR
               UPCASE(COMMENT) like '%REFUSED)%';
  QUIT;

注意:这不会使用comment上的索引。

答案 3 :(得分:1)

这是使用contains的另一种解决方案,其中搜索项来自数据集(例如可以从外部文件读取)。我喜欢它的便携性。

Proc sql noprint;
      select 'Upcase(Comment) contains '''||strip(Upcase(term))||''''
      into :strings separated by ' or '
      from exclusion_terms
      order by 1;

      create table Excluded as
      select *
      from Data_set
      where &strings;
Quit;

此处,第一部分从排除术语的数据集中创建宏变量string,然后用于创建排除数据集。

使用Contains的搜索字词的硬编码版本:

Proc Sql;
      create table Excluded as
      select *
      from Data_set
      where Upcase(Comment) contains ('INELIGIBLE' OR 'REFUSED');
Quit;