sql >> Databáze >  >> RDS >> Sqlserver

Najděte záznamy SQL obsahující podobné řetězce

Pokud opravdu chcete definovat podobnost přesně tak, jak jste to formulovali ve své otázce, pak byste – jak říkáte – museli implementovat výpočet Levenstheinovy ​​vzdálenosti. Buď v kódu vypočítaném na každém řádku načteném DataReaderem nebo jako funkce SQL Serveru.

Uvedený problém je ve skutečnosti složitější, než se může na první pohled zdát, protože nemůžete předpokládat, že víte, co vzájemně sdílené prvky mezi dvěma řetězci mohou být.

Takže kromě Levensthein Distance budete pravděpodobně chtít také zadat minimální počet po sobě jdoucích znaků, které se skutečně musí shodovat (aby byla uzavřena dostatečná podobnost).

Stručně řečeno:Zní to jako příliš komplikovaný a časově náročný/pomalý přístup.

Zajímavé je, že v SQL Server 2008 máte funkci DIFFERENCE, která může použít pro něco takového.

Vyhodnotí fonetickou hodnotu dvou řetězců a vypočítá rozdíl. Nejsem si jistý, jestli to dokážete správně fungovat pro víceslovné výrazy, jako jsou názvy filmů, protože to neumí dobře s mezerami nebo čísly a klade příliš velký důraz na začátek řetězce, ale i tak je to zajímavé predikát být si vědom.

Pokud to, čím jste ve skutečnosti pokoušíte se popsat nějakou funkci vyhledávání, pak byste se měli podívat na možnosti Fulltextového vyhledávání SQL Server 2008. Poskytuje vestavěnou podporu tezauru, efektní predikáty SQL a mechanismus hodnocení pro "nejlepší shody"

EDIT:Pokud hledáte odstranění duplikátů, možná byste se mohli podívat na SSIS Fuzzy Lookup a Fuzzy Group Transformation. Sám jsem to nezkoušel, ale vypadá to jako slibný návod.

EDIT2:Pokud se nechcete vrtat do SSIS a stále se potýkáte s výkonem algoritmu Levensthein Distance, můžete zkusit tento algoritmus, který se zdá být méně složitý.



  1. Import souboru .sql na windows do postgresql

  2. Přetrvávající UUID v PostgreSQL pomocí JPA

  3. Mohu použít příkaz CASE ve stavu JOIN?

  4. Jak převést unixovou epochu na časové razítko