To jest ściśle obserwacyjne. documentation jest całkiem jasne:
Liczba całkowita zwracana jest liczba znaków w SOUNDEX wartości że są takie same. Wartość zwracana jest w zakresie od 0 do 4: 0 oznacza słabe lub żadne podobieństwo, a 4 oznacza silne podobieństwo lub o tych samych wartościach.
Zgodnie z tą dokumentacją wartość zwracana nie powinna się różnić w zależności od kolejności argumentów.
Z moich zapytań: "Kennady" -> K530 i "Kary" -> K600. Mają one wspólne dwa znaki, więc wartość powinna być 2.
Teraz zauważam, że "Kenn" -> K500. Obcięcie "Kennady" na długość "Kary" daje wartość "3". Hmmm.
Dlatego uważam, że DIFFERENCE()
używa długości pierwszego argumentu do obcięcia drugiego argumentu. To sprawia, że kolejność argumentów jest ważna. Najpierw ustaw dłuższy argument.
Próbowałem tego na innych ciągach. Te same wzory wydają się działać. Nie znalazłem żadnej dokumentacji, która określałaby, że tak właśnie jest.
Przypuszczam, że Microsoft nazwałby to "funkcją", a nie "błędem";).
EDYTOWANIE:
Powyższe spekulacje nie są całkiem poprawne. Rozważmy następujący
- leepaupauld -> L114
- Leopold -> L143
- leepaup -> L110
Jednak
- różnica (leepaupauld Leopold) = 4 (!)
- różnica (leopold, leepaupauld) = 3
- różnica (leepaup Leopold) = 3 (!)
- różnica (Leopold, leepaup) = 2
The (!) Jest mój osąd, że wynik nie ma sensu w ogóle, biorąc pod uwagę wartości SOUNDEX dla struny.
Problem nie dotyczy długości. Jest to podstawowa metoda, którą @jpw wskazuje w komentarzu. Problem wydaje się być duplikatem pasujących wartości w jednym ciągu. Jednakże, zgodnie z dokumentacją, nie powinny one wielokrotnie pasować do tej samej postaci.
Moja rada: Użyj odległości Levenshteina. To ma sens. Działa lepiej na dłuższych łańcuchach. To jest przy zdrowych zmysłach. Nie jest wbudowany, ale łatwo znaleźć implementację w Internecie dla dowolnej bazy danych.
Sprawdziłem, czy to prawda. I że dokumentacja prawie mówi, że kolejność argumentów nie powinna mieć znaczenia. –
Dzięki. To tak bardzo mnie wyrzuca! – Jay
Dodałem pełny przykład problemu. Widzę to samo zachowanie. – UnhandledExcepSean