次の内容のテーブルがあります。
ID | Name | Alias
1 | William | Will,Willo,Wolli
ユーザーが指定した文字列のレーベンシュタイン距離 (またはメタフォン、それは問題ではありません) が、ユーザー名または既知のエイリアスのいずれかに対して定義されたしきい値よりも低い場合、行 ID を返したいと思います。
解決策として、ユーザー ID とユーザー エイリアスをリンクする追加のテーブルを使用することが考えられますが、できれば避けたいと思っています。
次の内容のテーブルがあります。
ID | Name | Alias
1 | William | Will,Willo,Wolli
ユーザーが指定した文字列のレーベンシュタイン距離 (またはメタフォン、それは問題ではありません) が、ユーザー名または既知のエイリアスのいずれかに対して定義されたしきい値よりも低い場合、行 ID を返したいと思います。
解決策として、ユーザー ID とユーザー エイリアスをリンクする追加のテーブルを使用することが考えられますが、できれば避けたいと思っています。
必要なのは、文字列の分割/展開です。次のように実行できます。
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;
いつものように、解決策は複数あります。
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
)