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;
我基本上有类似的代码
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;