SAS/SQL 基于一列模式的联接匹配另一列
SAS/SQL join based on one column pattern matches another column
我有 2 个数据集需要在 id 字段上进行匹配:
data1:
id
---------
00123abc5
data2:
id
---
23a
我需要在 id
列而不是 data1.id = data2.id
上合并(SQL 样式 inner join
)这两个数据集。我要的是data1.id contains data2.id
.
所以我想要第一个数据集中的 id
字符串包含第二个数据集的 id
字符串的所有行。
在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, '%')
如果您只需要来自 table 的行,请使用 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 || '%';
可以使用索引函数
data have;
input id .;
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 个数据集需要在 id 字段上进行匹配:
data1:
id
---------
00123abc5
data2:
id
---
23a
我需要在 id
列而不是 data1.id = data2.id
上合并(SQL 样式 inner join
)这两个数据集。我要的是data1.id contains data2.id
.
所以我想要第一个数据集中的 id
字符串包含第二个数据集的 id
字符串的所有行。
在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, '%')
如果您只需要来自 table 的行,请使用 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 || '%';
可以使用索引函数
data have;
input id .;
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;