Sql 检查列以获取来自另一列的值的子字符串

Sql 检查列以获取来自另一列的值的子字符串,sql,sas,Sql,Sas,我有一个100个位置(位置表)的列表,需要根据位置是否在目标数据(目标表)中缩减为10个。问题是位置没有相同的名称,但至少有一个单词是相同的 例如,Location_表中的CITY_SEATTLE与TARGET_表中的SEATTLE匹配。我可以从Location_表中删除CITY,但如果按比例缩放,则无法执行此操作,因为前缀不同 我尝试使用下面的代码来实现这一点,但遇到了问题,因为“子查询的计算结果超过了一行” 如何解决此问题?您可以使用EXISTS: PROC SQL; CREATE

我有一个100个位置(位置表)的列表,需要根据位置是否在目标数据(目标表)中缩减为10个。问题是位置没有相同的名称,但至少有一个单词是相同的

例如,Location_表中的CITY_SEATTLE与TARGET_表中的SEATTLE匹配。我可以从Location_表中删除CITY,但如果按比例缩放,则无法执行此操作,因为前缀不同

我尝试使用下面的代码来实现这一点,但遇到了问题,因为“子查询的计算结果超过了一行”


如何解决此问题?

您可以使用
EXISTS

PROC SQL; 
    CREATE TABLE UNIQUELOCATIONS AS 
           SELECT LOCATIONS_TABLE.CITY 
           FROM LOCATION_TABLE lt
           WHERE EXISTS (SELECT 1
                         FROM TARGET_TABLE tt
                         WHERE lt.CITY LIKE tt.CITY
                        );
    QUIT; 

您应该使用EXISTS操作符检查子查询是否有行。子查询的条件建立查找匹配。如果是您的情况,则LIKE运营商需要在目标城市进行%的前置和后置挂起。SAS有一个方便的操作符,它包含相同的操作。索引函数也可以作为子字符串用于测试目标城市

%let items = LONDON,NEW YORK,CHICAGO,HOUSTON;
%let pres = SUPER,SUB,GREATER,LESSER,EAST,WEST;

data many;
  do row = 1 to 100;
    item = catx('_',scan("&pres",ceil(6*ranuni(123))), scan("&items",ceil(4*ranuni(123)),','));
    output;
  end;
run;

data target;
  item = "NEW YORK"; output;
  item = "LONDON"; output;
run;

proc sql;
   create table items_like_target as
   select * from many
   where exists (select * from target where many.item contains trim(target.item))
   ;
quit;

这里的技巧是many.city位于操作符的左侧。由于SAS处理尾随空格的方式,为了使CONTAINS正常工作,必须对目标值进行修剪。

Sample input/'输出数据会有所帮助。还有什么其他前缀?城市名称前是否始终有下划线?
%let items = LONDON,NEW YORK,CHICAGO,HOUSTON;
%let pres = SUPER,SUB,GREATER,LESSER,EAST,WEST;

data many;
  do row = 1 to 100;
    item = catx('_',scan("&pres",ceil(6*ranuni(123))), scan("&items",ceil(4*ranuni(123)),','));
    output;
  end;
run;

data target;
  item = "NEW YORK"; output;
  item = "LONDON"; output;
run;

proc sql;
   create table items_like_target as
   select * from many
   where exists (select * from target where many.item contains trim(target.item))
   ;
quit;