Sql 使用IN()函数计算变量

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 |

我正在尝试解析in()函数中的datastep变量。我有一个如下所示的数据集:

|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,“-”)之间的级别[替换为正确的字符串]和/或介于和之间的级别