我有一张包含以下内容的表格:
ID | Name | Alias
1 | William | Will,Willo,Wolli
如果用户提供的字符串的levenshtein距离(或metaphone,无关紧要)低于用户名或任何已知别名的已定义阈值,我想返回行ID。
我知道一个可能的解决方案是使用一个额外的表来链接用户ID和用户别名,尽管如果可能的话我想避免使用它。
答案 0 :(得分: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;
答案 1 :(得分: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
)