Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于一列模式的SAS/SQL联接与另一列匹配_Sql_String_Sas_Inner Join_Sql Like - Fatal编程技术网

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

基于一列模式的SAS/SQL联接与另一列匹配,sql,string,sas,inner-join,sql-like,Sql,String,Sas,Inner Join,Sql Like,我需要在id字段上匹配2个数据集: 数据1: 数据2: 我需要合并SQL样式的内部连接id列上的这两个数据集,而不是data1.id=data2.id。我想要的是data1.id包含data2.id 因此,我希望第一个数据集中的id字符串包含第二个数据集的id字符串的所有行。在SQL中,使用LIKE运算符: SELECT d1.id FROM data1 d1 INNER JOIN data2 d2 ON d1.id LIKE CONCAT('%', d2.id, '%') 正如MouseM

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

数据1:

数据2:

我需要合并SQL样式的内部连接id列上的这两个数据集,而不是data1.id=data2.id。我想要的是data1.id包含data2.id

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

在SQL中,使用LIKE运算符:

SELECT d1.id
FROM data1 d1 
INNER JOIN data2 d2 ON d1.id LIKE CONCAT('%', d2.id, '%')
正如MouseMaster所评论的,如果在同一字段中碰巧发现多个ID,则此技术可能会生成重复的输出行。您可以使用DISTINCT消除重复项:

SELECT DISTINCT d1.id
FROM data1 d1 
INNER JOIN data2 d2 ON d1.id LIKE CONCAT('%', d2.id, '%')
如果只需要一个表中的行,请使用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 $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;

答案将是某种形式的LIKE语句,但请注意:如果data2中的值与示例中的值一样短,那么除非完整的数据集非常小,否则很有可能会在每个data2条目中找到多个匹配项。这实际上取决于结果的设计目的。他可以很容易地得到两个表,每个表只有3行,但却有一个9条记录的结果表。如果这是他想要的,那当然是好的:
select d1.id
from data1 d1
where exists (select 1 from data2 d2 where d1.id like '%' || d2.id || '%';
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;