Sas 在字母数字字符串变量的语句中使用

Sas 在字母数字字符串变量的语句中使用,sas,Sas,我需要进行查询,并在其中使用语句中的 首先,我在一个txt文件中读取: filename ticklist '/home/mypath/myfile.txt'; data sp500; infile ticklist; input smbl $; smbl=upcase(smbl); run; 这给了我变量sp500.smbl的值AA,HNZ,…(超过500) 然后我提出一个问题: data result; set mydata; where

我需要进行查询,并在其中使用语句中的

首先,我在一个txt文件中读取:

filename ticklist '/home/mypath/myfile.txt';
data sp500;
     infile ticklist;
     input smbl $;
     smbl=upcase(smbl);
run;
这给了我变量
sp500.smbl
的值
AA,HNZ,…
(超过500)

然后我提出一个问题:

data result;
     set mydata;
     where also company_symbol IN (sp500.smbl);
run;
我总是得到一个众所周知的问题:

语法错误,应为以下内容之一:带引号的字符串、数值常量、日期时间常量、缺少的值,-


如何将字母数字变量与
语句中的
一起使用?为什么不能使用它呢?字母数字字符串没有被引用吗?在
语句中的
需要什么样的数据结构?

您可以使用proc sql来实现这一点。您可能需要将修剪和压缩添加到company_符号,以确保空格不会破坏company_符号和smbl之间的任何匹配

这将从mydata中选择公司符号与表sp500中的smbl匹配的所有字段

proc sql noprint;

    create table result as
    select *
    from mydata
    where company_symbol in (select distinct smbl from sp500)
    ;
quit;

您可以使用procsql来实现这一点。您可能需要将修剪和压缩添加到company_符号,以确保空格不会破坏company_符号和smbl之间的任何匹配

这将从mydata中选择公司符号与表sp500中的smbl匹配的所有字段

proc sql noprint;

    create table result as
    select *
    from mydata
    where company_symbol in (select distinct smbl from sp500)
    ;
quit;

您可以使用procsql来实现这一点。您可能需要将修剪和压缩添加到company_符号,以确保空格不会破坏company_符号和smbl之间的任何匹配

这将从mydata中选择公司符号与表sp500中的smbl匹配的所有字段

proc sql noprint;

    create table result as
    select *
    from mydata
    where company_symbol in (select distinct smbl from sp500)
    ;
quit;

您可以使用procsql来实现这一点。您可能需要将修剪和压缩添加到company_符号,以确保空格不会破坏company_符号和smbl之间的任何匹配

这将从mydata中选择公司符号与表sp500中的smbl匹配的所有字段

proc sql noprint;

    create table result as
    select *
    from mydata
    where company_symbol in (select distinct smbl from sp500)
    ;
quit;

斯科特的答案肯定是好的,但这里有一些选择

首先,最接近您实际编写内容的方法是将术语括在引号中,将它们选择到宏变量中,然后在数据步骤中使用它们:

proc sql;
 select quote(smbl) into :smbllist separated by ' '
 from sp500;
quit;

data result;
set mydata;
where company_symbol in (&smbllist.);
run;
这不是一个特别好的方法,但它是有效的

备选方案:

数据步合并(或SQL连接)通常比比较中的好,因为它更好地利用了哈希/索引等

data result;
merge mydata(in=a) sp500(in=sp);
by company_symbol;
if a and sp;
run;
这需要对它们进行排序,并且两者的变量名相同(如果需要,可以在merge语句中的一个数据集上使用RENAME)。SQL内部联接也会做同样的事情,而且不需要显式排序,尽管它可能会在不告诉您的情况下为您排序数据(因此不会节省时间)。取决于哈希解决方案是否有效(如果有效,则无需排序)


如果排序对您来说是一个额外的步骤(即,如果通常不是以这种方式排序),则格式通常会更快

_fmts的数据; 设置sp500; fmtname='$SMBLF'; 开始=smbl; label=“1”*或者你想要的任何东西都是真的; 产出; 如果n=1,则执行; hlo='o'*这将检查是否存在不匹配; 开始=''; label='0'*或任何你想要的虚假; 产出; 结束; 运行

*smbl必须是NODUPKEY,因此如果存在重复项,则执行proc sort NODUPKEY

proc format cntlin=用于_fmts; 退出

数据结果; 设置mydata; 其中put(公司符号,$SMBLF.)为'1'; 运行


哈希表是最接近您在面向对象思想方面实际编写的内容

data result;
if _n_=1 then do;
if 0 then set sp500;
declare hash sp('dataset:sp500');
sp.defineKey('smbl');
sp.defineData('smbl'); *or whatever you want to return when found, if something;
sp.defineDone();
call missing (smbl); *initialize to missing to avoid warning;
end;
set mydata;
rc = sp.find(key:company_symbol);
if rc eq 0 then output; *or you could do this in one statement, skipping the rc, just being clear here;
run;

斯科特的答案肯定是好的,但这里有一些选择

首先,最接近您实际编写内容的方法是将术语括在引号中,将它们选择到宏变量中,然后在数据步骤中使用它们:

proc sql;
 select quote(smbl) into :smbllist separated by ' '
 from sp500;
quit;

data result;
set mydata;
where company_symbol in (&smbllist.);
run;
这不是一个特别好的方法,但它是有效的

备选方案:

数据步合并(或SQL连接)通常比比较中的好,因为它更好地利用了哈希/索引等

data result;
merge mydata(in=a) sp500(in=sp);
by company_symbol;
if a and sp;
run;
这需要对它们进行排序,并且两者的变量名相同(如果需要,可以在merge语句中的一个数据集上使用RENAME)。SQL内部联接也会做同样的事情,而且不需要显式排序,尽管它可能会在不告诉您的情况下为您排序数据(因此不会节省时间)。取决于哈希解决方案是否有效(如果有效,则无需排序)


如果排序对您来说是一个额外的步骤(即,如果通常不是以这种方式排序),则格式通常会更快

_fmts的数据; 设置sp500; fmtname='$SMBLF'; 开始=smbl; label=“1”*或者你想要的任何东西都是真的; 产出; 如果n=1,则执行; hlo='o'*这将检查是否存在不匹配; 开始=''; label='0'*或任何你想要的虚假; 产出; 结束; 运行

*smbl必须是NODUPKEY,因此如果存在重复项,则执行proc sort NODUPKEY

proc format cntlin=用于_fmts; 退出

数据结果; 设置mydata; 其中put(公司符号,$SMBLF.)为'1'; 运行


哈希表是最接近您在面向对象思想方面实际编写的内容

data result;
if _n_=1 then do;
if 0 then set sp500;
declare hash sp('dataset:sp500');
sp.defineKey('smbl');
sp.defineData('smbl'); *or whatever you want to return when found, if something;
sp.defineDone();
call missing (smbl); *initialize to missing to avoid warning;
end;
set mydata;
rc = sp.find(key:company_symbol);
if rc eq 0 then output; *or you could do this in one statement, skipping the rc, just being clear here;
run;

斯科特的答案肯定是好的,但这里有一些选择

首先,最接近您实际编写内容的方法是将术语括在引号中,将它们选择到宏变量中,然后在数据步骤中使用它们:

proc sql;
 select quote(smbl) into :smbllist separated by ' '
 from sp500;
quit;

data result;
set mydata;
where company_symbol in (&smbllist.);
run;
这不是一个特别好的方法,但它是有效的

备选方案:

数据步合并(或SQL连接)通常比比较中的好,因为它更好地利用了哈希/索引等

data result;
merge mydata(in=a) sp500(in=sp);
by company_symbol;
if a and sp;
run;
这需要对它们进行排序,并且两者的变量名相同(如果需要,可以在merge语句中的一个数据集上使用RENAME)。SQL内部联接也会做同样的事情,而且不需要显式排序,尽管它可能会在不告诉您的情况下为您排序数据(因此不会节省时间)。取决于哈希解决方案是否有效(如果有效,则无需排序)


如果排序对您来说是一个额外的步骤(即,如果通常不是以这种方式排序),则格式通常会更快

_fmts的数据; 设置sp500; fmtname='$SMBLF'; 开始=smbl; label=“1”*还是什么