sas 向宏值添加百分号以在 proc sql like 语句中使用

sas adding a percent sign to the macro values to use in proc sql like statement

我基本上有类似的代码

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).

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

如果匹配条件已存在于数据集中,请将其留在那里。在 sql.

中使用 EXISTS 子句

例如:

data codes;
  length code ;
  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.)
  ...

只需在使用 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;