Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Rechercher des enregistrements SQL contenant des chaînes similaires

Si vous voulez vraiment définir la similarité de la manière exacte que vous avez formulée dans votre question, alors vous devrez - comme vous le dites - implémenter le calcul de la distance de Levensthein. Soit en code calculé sur chaque ligne récupérée par un DataReader, soit en tant que fonction SQL Server.

Le problème énoncé est en fait plus délicat qu'il n'y paraît à première vue, car vous ne pouvez pas supposer savoir ce que le partage mutuellement éléments entre deux chaînes peuvent être.

Ainsi, en plus de la distance de Levensthein, vous souhaiterez probablement également spécifier un nombre minimum de caractères consécutifs qui doivent réellement correspondre (pour qu'une similitude suffisante soit conclue).

En résumé :cela ressemble à une approche trop compliquée et longue/lente.

Fait intéressant, dans SQL Server 2008, vous avez la fonction DIFFERENCE qui peut être utilisé pour quelque chose comme ça.

Il évalue la valeur phonétique de deux chaînes et calcule la différence. Je ne sais pas si vous le ferez fonctionner correctement pour les expressions multi-mots telles que les titres de films, car il ne gère pas bien les espaces ou les nombres et met trop l'accent sur le début de la chaîne, mais c'est toujours un intéressant prédicat à connaître.

Si ce que vous êtes réellement essayer de décrire est une sorte de fonctionnalité de recherche, alors vous devriez vous pencher sur les capacités de recherche en texte intégral de SQL Server 2008. Il fournit une prise en charge intégrée du thésaurus, des prédicats SQL sophistiqués et un mécanisme de classement pour les "meilleures correspondances"

EDIT:Si vous cherchez à éliminer les doublons, vous pouvez peut-être consulter SSIS Fuzzy Lookup et Fuzzy Group Transformation. Je n'ai pas essayé cela moi-même, mais cela semble être une piste prometteuse.

EDIT2 :Si vous ne voulez pas creuser dans SSIS et que vous avez toujours des difficultés avec les performances de l'algorithme de distance de Levensthein, vous pouvez peut-être essayer cet algorithme qui semble être moins complexe.