使用PROC SQL查找SAS中给定字符串中最多一个字母的字符串

时间:2011-04-26 13:23:52

标签: sql regex sas

首先是一些背景。我在SAS中使用proc sql,并且需要获取数据集中的所有条目(具有几百万个条目),其变量“Name”等于(比如说)“Massachusetts”。当然,由于数据曾经由人类手动输入,因此接近所有可能出现的拼写错误(“Amssachusetts”,“Kassachusetts”等)。

我发现很少有条目错误地超过两个字符,所以代码

Name like "__ssachusetts" OR Name like "_a_sachusetts" OR ... OR Name like "Massachuset__"

会选择我要查找的条目。但是,我希望必须有一种更方便的方式来编写

Name that differs by at most 2 characters from "Massachusetts";

有吗?或者是否有其他策略来获取这些条目?我尝试搜索stackoverflow和网络但是不成功。我也是SQL和SAS的初学者。

一些额外的信息:数据库不是英文的(实际的字符串不是“马萨诸塞州”)所以使用SOUNDEX实际上并不可行(如果有的话)。

提前致谢。

(编辑:改进标题)

5 个答案:

答案 0 :(得分:13)

SAS具有内置函数COMPGEDCOMPLEV来计算字符串之间的距离。这是一个示例,显示如何选择Levenshtein编辑距离小于或等于2的那些。

data typo;
input name $20.;
datalines;
massachusetts
masachusets
mssachusetts
nassachusets
nassachussets
massachusett
;

proc sql;
  select name from typo
  where complev(name, "massachusetts") <= 2;
quit;

答案 1 :(得分:4)

还有其他语音算法,如Hamming distance,应该可以更好地运作。 您可以在Google上搜索特定数据库引擎的此算法实现。

答案 2 :(得分:3)

您要找的是“Approximate string matching”。为此,可以使用“Levenshtein distance computing algorithm”。我不确定,但希望this answer will help

答案 3 :(得分:1)

您可以实现此类型的存储函数(Oracle语法,转换为您的RDBMS):

CREATE FUNCTION distance(one VARCHAR2, two VARCHAR2) RETURN NUMBER IS
DETERMINISTIC
BEGIN
  -- do some comparison here
END distance;

然后在SQL中使用它:

SELECT * FROM table WHERE distance(name, 'Massachusetts') <= 2

当然,这些事情往往很慢......

答案 4 :(得分:0)

我知道这已经太晚了四年,但因为它也可能会给正在搜索此主题的其他人提供想法: 您正在考虑的是一个语义分层设计,您需要为这些不同的文本比较实现一些条件逻辑,使用像Jaro-Winkler这样的Lenvenschtien距离来比较不同长度的文本和Hamming用于您想要的相同长度的文本简单的文本转换定位。现在所有各种文本挖掘程序都不是什么新鲜事。 这是一篇在我看来非常好的帖子; Jaro-Winkler string comparison function in SAS