1

電子メール アドレスが別のアドレスと一致するかどうかを確認する必要がありますが、1 つのタイプミス (「hotmail」ではなく「hormail」、文字の欠落、余分な文字など) の可能性があります。

これは postgresql (バージョン 9.1.4) クエリであり、fuzzymatch も levenshtein も使用できません。

4

2 に答える 2

2

ここが出発点です。これは、両方の電子メールを (char-pos, char) ペアに分解し、2 つの入力間で一致しないペアを見つける関数です。

CREATE OR REPLACE FUNCTION email_diffs(
    email1 IN text, email2 IN text, 
    chnum OUT integer, ch OUT text, fromwhich OUT integer
) 
RETURNS SETOF RECORD AS $$
BEGIN
    RETURN QUERY
    WITH 
        e1chars AS (
            SELECT generate_series(0, length($1) -1 ) AS chpos, regexp_split_to_table($1,'') ch
        ),
        e2chars AS (
            SELECT generate_series(0, length($2) - 1) AS chpos, regexp_split_to_table($2,'') ch
        ),
        only_in_e1chars AS (
            SELECT * FROM e1chars EXCEPT SELECT * FROM e2chars
        ),
        only_in_e2chars AS (
            SELECT * FROM e2chars EXCEPT SELECT * FROM e1chars
        ),
        mismatched_pairs AS (
            SELECT *, 1 FROM only_in_e1chars UNION SELECT *, 2 FROM only_in_e2chars
        )
    SELECT * FROM mismatched_pairs;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;

結果は次のようになります。

regress=# SELECT * FROM email_diffs('fred@bo','fred@bob');
 chnum | ch | fromwhich 
-------+----+-----------
     7 | b  |         2
(1 row)

regress=# SELECT * FROM email_diffs('fred@bob','fred@bbo');
 chnum | ch | fromwhich 
-------+----+-----------
     6 | b  |         2
     6 | o  |         1
     7 | b  |         1
     7 | o  |         2
(4 rows)

関心のある各エラーをテストする別の CTE でこれを呼び出すか、そのメイン関数で CTE を拡張して、各ケースをテストし、評決を返す追加の句を追加することができます。

正確な方法は、テストする必要があるルールの詳細と、正確に 1 つのタイプミスを検出するためにどれだけ厳密に行う必要があるかによって異なります。あなたはそれを指定していません。


SELECT リストで 2 つの関数が呼び出されている と で、e1charsFROM句のない SELECT の使い方が奇妙に見えることに気付いたかもしれません。e2charsこれは非常に奇妙な PostgreSQL の SQL 拡張機能であり、通常は使用すべきではありません。多くの場合、期待どおりの結果が得られないためです。PostgreSQL は 9.3 で SQL 標準LATERAL構文をサポートするため、優先して使用する必要があります。

于 2012-08-31T13:39:44.037 に答える
0

fuzzystrmatch および/または pg_trgm Postgres 拡張機能を使用する必要があります。これらを有効にするには、次を実行します。

$ psql mydb
mydb=# CREATE EXTENSION fuzzystrmatch;
mydb=# CREATE EXTENSION pg_trgm;

その後、次のようなクエリを実行できます。

mydb=# SELECT email from Users where email % 'hormail' or difference(email, 'hormail') > 2;
于 2012-10-02T15:30:54.393 に答える