sas为宏s值添加百分号,以便在proc sql like statement中使用

时间:2018-02-09 23:09:08

标签: sas sas-macro

我基本上有类似的代码

V2566
T67879
F7899
78902
在sas数据集中。这些值,我想用来存储在宏中。 引号我写这段代码

PROC SQL NOPRINT;
SELECT quote(CODES,"'") 
INTO :CODES  separated by ", "
FROM CODES;
QUIT;
%put macro variable CODES:&CODES;

这只是添加了引号。如何修改以获取代码,方法是在每个值之前和之后添加%,以使用任何值('%V2566%','%T67879%','%F7899%','%78902%')。这可以在我的报价中使用。

proc sql;
....
select ... where CODES like any (&CODES).

2 个答案:

答案 0 :(得分:1)

LIKE ANY是Teradata结构,Proc SQL不支持该语法。

如果匹配条件已经存在于数据集中,请将其留在那里。在sql中使用EXISTS子句。

例如:

data codes;
  length code $10;
  input code @@; datalines;
Ja To Tom ary
;

proc sql;
  create table matched_by_containing_code
  as select *
  from sashelp.class
  where exists (select * from codes where class.name contains trim(code))
  ;
quit;

注意:如果您定义了名为ANY的自定义函数,则以下语法正确但功能错误。

proc FCMP; ... function ANY ... ; 
proc sql;
  create table matched_by_containing_code
  as select *
  from sashelp.class
  where name like any ('%Ja%', '%To%', '%Tom%', '%ary%')
  ;
quit;

对于构建连接到数据库的SQL传递的一部分来识别LIKE ANY的情况,通过调整单引号的元素来构造列表

PROC SQL NOPRINT;
  SELECT quote(cats('%',CODE,'%'),"'") /* pre and post pend wildcards to the base code value */
  INTO :CODES  separated by ", "
  FROM CODES;
QUIT;
%put macro variable CODES:%superq(CODES);

Proc SQL;
  ... my pass through ...
    ... like any (&CODES.)
  ...

答案 1 :(得分:1)

在使用QUOTE()函数之前,只需添加值。

SELECT quote(cats('%',CODES,'%'),"'") 

但是您需要使用传递SQL来使用LIKE ANY

select * from connection to mydb
(... where CODES like any (&CODES) ... )
;

如果您想要简化LIKE ANY功能,那么您可以在宏变量中添加更多代码吗?

PROC SQL NOPRINT;
SELECT 'CODES LIKE '||quote(cats('%',CODES,'%'),"'") 
  INTO :where separated by " or "
  FROM CODES
;
create table want as 
  select ....
  where &where
;
quit;