Sql 使用IN()函数计算变量
我正在尝试解析in()函数中的datastep变量。我有一个如下所示的数据集:Sql 使用IN()函数计算变量,sql,function,variables,sas,Sql,Function,Variables,Sas,我正在尝试解析in()函数中的datastep变量。我有一个如下所示的数据集: |Run|Sample Level|Samples Tested| | 1 | 1 | 1-5 | | 1 | 2 | 1-5 | ...etc | 1 | 5 | 1-5 | --------------------------------- | 2 | 1 | 1-4 |
|Run|Sample Level|Samples Tested|
| 1 | 1 | 1-5 |
| 1 | 2 | 1-5 |
...etc
| 1 | 5 | 1-5 |
---------------------------------
| 2 | 1 | 1-4 |
| 2 | 2 | 1-4 |
测试的样品因运行而异。通常情况下,数据集中仅有的样本水平在“测试样本”提供的范围内。然而,有时情况并非如此,而且可能会变得一团糟。例如,我上一次工作的是这样的:
|Run|Sample Level|Samples Tested|
| 1 | 1 |2-9, 12-35, 37-40|
在本例中,我希望删除所有样本级别未包含在测试样本中的行,这是通过手动添加代码实现的:
Data Want;
set Have;
if sample_level not in (2:9, 12:35, 37:40) then delete;
run;
但是我想做的是通过查看测试的样本列自动完成这项工作。将“-”转换为“:”很容易,但我遇到的困难是如何使用IN()
函数来识别或解析变量。我想要这样的代码:如果sample\u level不在(Samples\u Tested)中,则删除代码>其中测试的样本已转换为IN()
函数可以处理的内容。我也不反对使用procsql代码>如果任何人有他们认为可行的解决方案。我知道你可以做这样的事情
Proc sql; Create table want as select * from HAVE where Sample_Level in (Select Samples_Tested from Have); Quit;
但问题是,测试的样本因运行而异,可能有16次不同的运行。希望我已经足够清楚地解释了这个挑战。感谢您抽出时间阅读此文章,并提前感谢您的帮助 假设测试的样本值对于每个运行值都是常量,您可以使用它来生成选择标准。例如,您可以使用data _null _步骤将WHERE语句写入文件,然后%将该代码包含到另一个数据步骤中
filename code temp;
data _null_;
file code;
if eof then put ';';
set have end=eof;
by run;
if first.run;
if _n_=1 then put 'where ' @ ;
else put ' or ' @ ;
samples_tested=translate(samples_tested,':','-');
put '(' run= 'and sample_level in (' samples_tested '))';
run;
data want;
set have;
%include code;
run;
注意:
中的是运算符,而不是函数。很高兴看到SAS代码;-)
这将适用于一个范围:
select * from HAVE where level in (tested);
对于多个范围,我会在MySQL中使用子字符串_INDEX,或者只使用子字符串和INDEX的组合来查找下一个条件。
从何处选择*级别in(tested1)或level in(tested2)或level in(tested3);
例如,将tested1替换为substr(tested,1,index(tested,“,”)
我使用以下方法生成示例:
创建表有
(运行int,
级别int,
测试varchar(20));
插入have(运行、调平、测试)
数值(1,1,3-5);
插入have(运行、调平、测试)
数值(1,3,“3-5,12:35”);
插入have(运行、调平、测试)
值(1,20,“3-5,12-35”);对于测试的样本,运行的每个值是否只有一个值?是的。所有运行1都将具有相同的样本测试值。与运行2等的所有值相同。这非常接近工作,如果“运行”是字符变量,我将如何更改它?变量“运行”采用1XYZ99、2XYZ99、3XYZ99等值。嗯。我一定是出了什么问题。下面是我的语句:put'('run\u ID=:$quote.”和sample\u level in('samples\u tested');
我得到了错误消息:“+)-2200错误:解析WHERE子句时语法错误。”查看生成的代码。只需打开文件或将其复制到日志。或者,您可以将/source2
选项添加到%include
语句中,以查看日志中包含的文件中的代码行。if eof生成了一个额外的右括号。。。。修正了答案,我来试试!如果有不同数量的条件呢?例如,运行1测试了样本=“2-9、12-35、37-40”,运行2测试了“1、10、11、36、41-50”,运行3测试了“1-40”。我需要一个不同数量的“testedX”,这取决于运行的要求,对吗?oops,只是双重检查:在SQL中的函数中只检查值列表,而不检查范围。唯一的机会是使用x和y之间的函数。您可以使用相同的逻辑,只是小心地从测试的字符串中提取值。在您的示例tested=“2-9,12-35,37-40”中,运行2的值为“1,10,11,36,41-50”,运行3的值为“1-40”,您需要在substr(tested,1,index(tested,“-”)和substr(tested,index(tested,“-”)+1,index(tested,”)-index(tested,“-”)之间的级别[替换为正确的字符串]和/或介于和之间的级别