我有一个数据集,其中包含一些排除主题的注释。我想制作一个迷你数据集来收集这些主题。
我正在尝试使用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;
我一直收到一条错误,上面写着“喜欢操作员需要字符操作数”
如何才能使其成为正确的语法查询?
由于
答案 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;