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