基于一个列模式的SAS / SQL连接与另一列匹配

时间:2019-01-25 21:40:19

标签: sql sas

我在id字段上需要匹配2个数据集:

数据1:

id
---------
00123abc5

数据2:

id
---
23a

我需要在SQL inner join列上合并这两个数据集(SQL风格id),而不是data1.id = data2.id。我想要的是data1.id contains data2.id

因此,我希望第一个数据集中的id字符串包含第二个数据集的id字符串的所有行。

3 个答案:

答案 0 :(得分:5)

在SQL中,使用LIKE运算符:

SELECT d1.id
FROM data1 d1 
INNER JOIN data2 d2 ON d1.id LIKE CONCAT('%', d2.id, '%')

如TheMouseMaster所评论,如果在同一字段中碰巧发现多个ID,则此技术可能会生成重复的输出行。您可以使用DISTINCT消除重复项:

SELECT DISTINCT d1.id
FROM data1 d1 
INNER JOIN data2 d2 ON d1.id LIKE CONCAT('%', d2.id, '%')

答案 1 :(得分:2)

您可以使用索引功能

data have;
input id $9.;
datalines;
00123abc5
00543abc5
;
data have1;
input id $ col1;
datalines;
23a 22
43a 72
73a 82
;

  proc sql;
   create table want as 
  select a.id, col1
  from have a
  inner join
  have1 b
 on index(a.id, trim(b.id)) gt 0;

答案 2 :(得分:1)

如果只希望从一个表中获取行,请使用EXISTS

select d1.id
from data1 d1
where exists (select 1 from data2 d2 where d1.id like concat('%', d2.id, '%');

实际上,在SAS中,我将使用标准的串联运算符:

select d1.id
from data1 d1
where exists (select 1 from data2 d2 where d1.id like '%' || d2.id || '%';