2

我有一个包含以下内容的表格:

ID | Name | Alias

1 | William | Will,Willo,Wolli

如果用户提供的字符串的 levenshtein 距离(或变音位,没关系)低于为用户名或任何已知别名定义的阈值,我想返回行 ID。

我知道一个可能的解决方案是使用一个额外的表来链接用户 ID 和用户别名,但如果可能的话我想避免它。

4

2 回答 2

3

您需要的是字符串拆分/爆炸。可以这样做:

SELECT DISTINCT u.id FROM users AS u LEFT JOIN
(SELECT u.id,unnest(string_to_array(u.alias, ',')) AS ALIAS FROM users AS u) AS q
ON u.id=q.id
WHERE levenshtein(u.name,'Jill')<3
OR levenshtein(q.ALIAS,'Jill')<3;   

http://sqlfiddle.com/#!12/494e6/5

于 2013-03-11T20:37:27.667 回答
2

像往常一样,有不止一种解决方案:

select  u.id
from    users u
where   3 >
any
(
    select  levenshtein ( 'Willey'::text, a )
    from    regexp_split_to_table
        (
            concat_ws ( ',' , u.name::text , u.alias::text )
        ,   ','
        ) as a
)
于 2013-03-11T22:10:35.373 回答