我基本上有类似的代码
V2566
T67879
F7899
78902
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).
答案 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;