我有一个表(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知识不是很强,所以对此的任何帮助都会非常感激。
答案 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 }})。
这些比一堆嵌套函数更具可读性,并避免在忘记修剪,剥离等问题时出现这样的问题。