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

sas向宏值添加百分号以在proc sql like语句中使用,sas,sas-macro,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
在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).

与任何
一样是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;
对于构造连接到数据库的pass-through SQL的一部分的情况,与任何其他SQL一样,该列表是通过调整单引号的元素来构造的

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

与任何
一样是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;
对于构造连接到数据库的pass-through SQL的一部分的情况,与任何其他SQL一样,该列表是通过调整单引号的元素来构造的

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,'%'),"'") 
但是您需要使用pass-through-SQL来像任何一样使用

select * from connection to mydb
(... where CODES like any (&CODES) ... )
;
如果您想模仿任何功能,那么您是否可以向宏变量中添加更多代码

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

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

SELECT quote(cats('%',CODES,'%'),"'") 
但是您需要使用pass-through-SQL来像任何
一样使用

select * from connection to mydb
(... where CODES like any (&CODES) ... )
;
如果您想模仿任何功能,那么您是否可以向宏变量中添加更多代码

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

你尝试了什么?我尝试了数据代码;设置代码;调用symput('code',TRIM(解析('%&code%'));运行;%放置宏变量代码:&代码;这在之前和之后都创建了好几个百分比。您尝试了什么?我尝试了数据代码;设置代码;调用symput('code',TRIM(解析('%&code%'));运行;%放置宏变量代码:&代码;这在之前和之后创建了好几个百分比。我处理SQL实际上是连接到teradata@viji我想你是想说你正在使用SQL传递直接连接到你的DBMS?我是proc SQL我实际上是连接到teradata@viji我想您是想说您正在使用SQL传递直接连接到您的DBMS?I认为随着数据行和代码行数量的增加,作为CASE语句,codegen将更加有效。SAS或求值并没有快捷方式,因此当存在匹配项时,会求值所有类似的表达式。当然,非选择要求对所有表达式进行求值,我认为随着数据行和代码行数量的增加,codegen作为CASE语句将更加有效。SAS或求值并没有快捷方式,因此当存在匹配项时,会求值所有类似的表达式。当然,非选择要求对所有表达式进行求值。