在 SAS 的 PROC SQL 语句中对多个变量使用相同的条件
Using the same condition for multiple variables in PROC SQL statement on SAS
我使用包含数百列的大表。我继续 运行 解决一个问题,即需要检查用作标志的多个列(值为 1 或缺失)的相同条件。举个简单的例子,
proc sql;
create table Applications as
select t1.ApplicantID
, t1.ApplicationDate
, t2.Segment
from Applicants as t1 inner join
Segmentation as t2 ON t1.ApplicantID = t2.ApplicantID
where t1.ApplicantID ^= ''
AND (t1.TR_flag = '') AND (t1.TL_flag = '')
AND (t1.RU_flag = '') AND (t1.RP_flag = '')
AND (t2.OP_flag = '') AND (t2.OU_flag = '')
AND (t2.GG_flag = '') AND (t2.GK_flag = '')
order by t1.ApplicantID
;
quit;
因此,我想知道是否有任何简洁的方法可以一步检查所有标志变量的这种情况。我确实意识到我可以使用数组选项进行循环,但对于这样一个简单的问题来说它似乎太复杂了。我也可以将所有变量连接成一个字符串并在新字符串上使用条件,但此解决方案并不通用。基本上我正在寻找的是类似 IN 运算符的东西,但走向相反的方向,例如,
where t1.ApplicantID ^= ''
AND (t1.TR_flag, t1.TL_flag, t1.RU_flag, t1.RP_flag,
t2.OP_flag, t2.OU_flag, t2.GG_flag, t2.GK_flag) = ''
与 运行.
相比,哪个更美观,在最佳情况下速度更快
您可以使用 CMISS
,以及您需要缺少的参数数量:
CMISS (t1.TR_flag, t1.TL_flag, t1.RU_flag, t1.RP_flag,
t2.OP_flag, t2.OU_flag, t2.GG_flag, t2.GK_flag) = 8
对于特定值,并且不干扰连接:
(t1.TR_flag = t1.TL_flag = t1.RU_flag = t1.RP_flag = '1'
AND
t2.OP_flag = t2.OU_flag = t2.GG_flag = t2.GK_flag = '1')
不过,我看不出这比 运行 快多少。
我使用包含数百列的大表。我继续 运行 解决一个问题,即需要检查用作标志的多个列(值为 1 或缺失)的相同条件。举个简单的例子,
proc sql;
create table Applications as
select t1.ApplicantID
, t1.ApplicationDate
, t2.Segment
from Applicants as t1 inner join
Segmentation as t2 ON t1.ApplicantID = t2.ApplicantID
where t1.ApplicantID ^= ''
AND (t1.TR_flag = '') AND (t1.TL_flag = '')
AND (t1.RU_flag = '') AND (t1.RP_flag = '')
AND (t2.OP_flag = '') AND (t2.OU_flag = '')
AND (t2.GG_flag = '') AND (t2.GK_flag = '')
order by t1.ApplicantID
;
quit;
因此,我想知道是否有任何简洁的方法可以一步检查所有标志变量的这种情况。我确实意识到我可以使用数组选项进行循环,但对于这样一个简单的问题来说它似乎太复杂了。我也可以将所有变量连接成一个字符串并在新字符串上使用条件,但此解决方案并不通用。基本上我正在寻找的是类似 IN 运算符的东西,但走向相反的方向,例如,
where t1.ApplicantID ^= ''
AND (t1.TR_flag, t1.TL_flag, t1.RU_flag, t1.RP_flag,
t2.OP_flag, t2.OU_flag, t2.GG_flag, t2.GK_flag) = ''
与 运行.
相比,哪个更美观,在最佳情况下速度更快您可以使用 CMISS
,以及您需要缺少的参数数量:
CMISS (t1.TR_flag, t1.TL_flag, t1.RU_flag, t1.RP_flag,
t2.OP_flag, t2.OU_flag, t2.GG_flag, t2.GK_flag) = 8
对于特定值,并且不干扰连接:
(t1.TR_flag = t1.TL_flag = t1.RU_flag = t1.RP_flag = '1'
AND
t2.OP_flag = t2.OU_flag = t2.GG_flag = t2.GK_flag = '1')
不过,我看不出这比 运行 快多少。