Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dopasowywanie rozmyte SQL

Raczej szybkim rozwiązaniem specyficznym dla domeny może być obliczenie podobieństwa ciągów za pomocą SOUNDEX i odległości liczbowej między 2 ciągami. Pomoże to tylko wtedy, gdy masz dużo kodów produktów.

Używając prostego UDF, jak poniżej, możesz wyodrębnić znaki numeryczne z ciągu, dzięki czemu możesz uzyskać 2200 z „CLC 2200npk” i 1100 z „CLC 1100”, dzięki czemu możesz teraz określić bliskość na podstawie wyjścia SOUNDEX każdego wejścia jak również bliskość składnika numerycznego każdego wejścia.

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

Jeśli chodzi o algorytmy ogólnego przeznaczenia, istnieje kilka, które mogą pomóc z różnym stopniem sukcesu w zależności od rozmiaru zestawu danych i wymagań dotyczących wydajności. (oba linki mają dostępne implementacje TSQL)

  • Podwójny metafon — ten algorytm zapewnia lepsze dopasowanie niż soundex kosztem szybkości, ale jest naprawdę dobry do poprawiania pisowni.
  • Odległość Levenshteina — oblicza, ile naciśnięć klawiszy potrzeba, aby zamienić jeden ciąg w inny, na przykład, aby przejść z „CLC 2200npk” do „CLC 2200” wynosi 3, podczas gdy z „CLC 2200npk” do „CLC 1100” wynosi 5.

Oto interesujący artykuł, który stosuje oba algorytmy razem, co może dać ci kilka pomysłów.

Mam nadzieję, że niektóre z nich trochę pomogą.

EDYCJA:Oto znacznie szybsza częściowa implementacja Levenshtein Distance (przeczytaj post, który nie zwróci dokładnie takich samych wyników jak normalny). Na moim stole testowym zawierającym 125000 wierszy działa on w 6 sekund w porównaniu do 60 sekund dla pierwszego, z którym się połączyłem.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 sposoby uzyskania etapów zadania zadania agenta serwera SQL (T-SQL)

  2. Tabela tymczasowa serwera SQL Server zniknie

  3. Zapytanie, które zwraca hierarchiczną listę typów zdarzeń wyzwalających w SQL Server

  4. SQL Server - brak NATURAL JOIN / x JOIN y USING(pole)

  5. LEFT() vs SET TEXTSIZE w SQL Server:jaka jest różnica?