SAS - 用类似的子选择

时间:2015-06-01 14:46:55

标签: sql sas proc-sql

希望每个人都度过一个美好的周末。

我有一个表(tableA),其中一列具有如下所示的值:

列1:

xyz-12345678
rdr-32343234
fgm-23423423

然后我有另一张表(tableB),其中一列包含tableA.column1中的所有值,然后还有一些如下所示

列1:

rfxyz-1234567800012015-01-029
grrdr-3234323485832015-02-037
tyfgm-2342342343432014-12-148

正如您所看到的,tableA.column1的值已嵌入tableB.column1中。我编写了一个子选择查询,如下所示,以识别tableB.column1中嵌入tableA.column1值的所有实例,但我得到0结果且没有错误。我可以清楚地看到tableA.column1中存在tableB.column1中存在的行值,但我不确定我在这里做错了什么导致没有错误且没有结果,我的SAS proc sql如下:

PROC SQL;
select i.*
from tableA i
where exists (select *
              from tableB
              where i.column1 like '%'||column1||'%'
             )
;
quit;

由于我的SAS知识不是很强,所以对此的任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:3)

你的情况是倒退的。 TableB的列较长,因此您希望它位于LIKE的左侧:

PROC SQL;
select i.*
from tableA i
where exists (select *
              from tableB b
              where b.column1 like '%' || i.column1 || '%'
             )
;
quit;

我建议您为所有列引用使用表别名,尤其是在相关子查询中。

答案 1 :(得分:1)

您的尝试和您的描述并不完全匹配。如果您认为您正在尝试使用tableA中的值,那么该值将在tableB中的另一条记录中进行处理。如果是这种情况,那么你只需稍微混淆你的where子句,它应该是:

select i.*
from tableA i
where exists (select *
              from tableB
              where tableB.column1 like '%'||i.column1||'%'
             );

用以前的价值代替以前:

WHERE 'xyz-12345678' LIKE '%tyfgm-2342342343432014-12-148%' 

哪个是假的,你需要它:

WHERE 'tyfgm-2342342343432014-12-148' LIKE '%xyz-12345678%'

如果您的描述是可信的,那么您的where子句是正确的,但您的表格是错误的方式:

  

标识tableB.column1中嵌入了tableA.column1值的所有实例

所以你想要从tableB中选择:

select i.*
from tableB i
where exists (select *
              from tableA a
              where i.column1 like '%'||a.column1||'%'
             );

答案 2 :(得分:1)

除了其他答案中提到的问题之外,我还建议一种避免空格问题的基本技巧。

where i.column1 like cats('%',a.column1,'%')

cats会自动从两侧剥离空格。还有cat(只是连接),catt(只是右边的修剪)和catx / catq(分隔,后面的引号也类似于{{1 }})。

这些比一堆嵌套函数更具可读性,并避免在忘记修剪,剥离等问题时出现这样的问题。