sql >> データベース >  >> RDS >> Sqlserver

SQLあいまいマッチング

    ドメイン固有のかなり迅速な解決策は、SOUNDEXと2つの文字列間の数値距離を使用して文字列の類似性を計算することです。これは、製品コードがたくさんある場合にのみ役立ちます。

    以下のような単純なUDFを使用すると、文字列から数値文字を抽出できるため、「CLC 2200npk」から2200、「CLC 1100」から1100を取得できるため、各入力のSOUNDEX出力に基づいて近さを判断できます。各入力の数値コンポーネントの近さも同様です。

    CREATE Function [dbo].[ExtractNumeric](@input VARCHAR(1000))
    RETURNS INT
    AS
    BEGIN
        WHILE PATINDEX('%[^0-9]%', @input) > 0
        BEGIN
            SET @input = STUFF(@input, PATINDEX('%[^0-9]%', @input), 1, '')
        END
        IF @input = '' OR @input IS NULL
            SET @input = '0'
        RETURN CAST(@input AS INT)
    END
    GO
    

    汎用アルゴリズムに関する限り、データセットのサイズとパフォーマンス要件に応じてさまざまな程度の成功を収めるのに役立つ可能性のあるアルゴリズムがいくつかあります。 (両方のリンクでTSQL実装を利用できます)

    • ダブルメタフォン-このアルゴは、スペル修正に非常に適していますが、速度を犠牲にして、soundexよりも優れた一致を提供します。
    • レーベンシュタイン距離-これは、たとえば「CLC2200npk」から「CLC2200」に到達するために1つの文字列を別の文字列に変換するのに必要なキー押下数を計算します。「CLC2200npk」から「CLC1100」は3です。 5.

    これは、両方のアルゴリズムを一緒に適用する興味深い記事であり、いくつかのアイデアが得られる可能性があります。

    うまくいけば、そのいくつかが少し役立つでしょう。

    編集:これははるかに高速な部分的なレーベンシュタイン距離の実装です(通常の結果とまったく同じ結果を返さない投稿を読んでください)。 125000行のテストテーブルでは、最初にリンクしたものの60秒と比較して、6秒で実行されます。




    1. SQLコマンドで使用される特別な要素の不適切な中和

    2. DjangoでPostgreSQLデータベースを設定する方法

    3. MySQL高可用性フレームワークの説明–パートII:準同期レプリケーション

    4. 1つのMySQLテーブルを別のMySQLテーブルの値で更新します