Расширенные сравнения строк в Oracle SQL - PullRequest
5 голосов
/ 22 февраля 2012

Я хочу знать, есть ли способ, в Oracle SQL, сравнить две строки на предмет сходства, отличного от = или like.Например, SQL Server имеет функцию difference(str1, str2), которая сравнивает две строки и дает оценку сходства (от 0 до 4).Не совсем то, что я хочу, но это все равно было бы чрезвычайно полезно.

Я специально надеялся на функции или методы , которые бы:

  1. сравнивали символ строкисимвол (возвращает количество точных совпадений)
  2. Скажите, сколько символов в одной строке, но в неправильном месте

Основное использование будет для строк одинаковой длины, чтосодержать номера (идентификаторы, номера телефонов и т. д.). Для своих целей я бы использовал их для поиска возможных совпадений, в которых буквы / цифры могли быть транспонированы.Soundex(string) хорошо работает с альфа-строками, но, кажется, игнорирует числа (по уважительной причине).

У меня нет привилегий для создания функций самостоятельно, но если кто-то знает способ выполнения этого, я бы заинтересовалсяуслышав это.Одно из решений для сравнения char-to-char (которое работает только в том случае, если вы знаете количество символов MAX):

 --For char-to-char counts
    Decode(substr(ID1,1,1),  substr(ID2,1,1), 1,  0) +
    Decode(substr(ID1,2,1),  substr(ID2,2,1), 1,  0) +
    [...]
    Decode(substr(ID1,N,1),  substr(ID2,N,1), 1,  0)

Но это не так элегантно, как вы можете получить.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

20 голосов
/ 22 февраля 2012

Звучит так, будто вы ищете пакет UTL_MATCH

SELECT utl_match.edit_distance( string1, string2 )
  FROM dual

сообщает вам количество правок, необходимых для преобразования строки1 в строку2

SQL> select utl_match.edit_distance( 'Bear', 'berry' ) from dual;

UTL_MATCH.EDIT_DISTANCE('BEAR','BERRY')
---------------------------------------
                                      3

Есть также пара функций сходства EDIT_DISTANCE_SIMILARITY и JARO_WINKLER_SIMILARITY, которые дают оценки сходства между 0 и 100, что дает вам представление о том, насколько похожи строки.

1 голос
/ 22 февраля 2012

Есть несколько способов решить эту проблему в Oracle:

  1. Вы можете создать хранимую процедуру.

  2. Вы можете загрузить код Java в базу данных Oracle и использовать функции, определенные в коде ( intro ).

  3. Вы можете извлечь строки из базы данных и сравнить их в своем приложении.

Плюсы / минусы:

Процедуры хранения довольно сложно написать и поддерживать, и они могут быть медленными. Но они являются стандартным, часто используемым инструментом, поэтому, если ваша компания не придерживается строгой политики запрета, они обычно являются «решением» (часто как регулярное выражение, которое решает одну проблему и создает две новые).

Java-код - чрезвычайно мощный инструмент, но я видел много установок Oracle, и до сих пор никто не использовал Java-код. Я не уверен, в чем причины, многие люди кажутся осторожными, но ничего надежного никогда не материализовалось. Также обратите внимание, что серверы БД оптимизированы для ввода-вывода и в меньшей степени для ЦП. Такой сложный Java-код может повредить вашей производительности больше, чем вы ожидаете (следуя указаниям «многие опасаются»)

Последнее решение всегда работает, но в зависимости от того, что вам нужно, оно может просто не быть вариантом. С другой стороны, я видел код, который выполнял намного лучше, загружая много данных и выполняя сложную обработку в приложении. В одном примере запрос занял бы 15 секунд, а загрузка + командная строка grep(1) заняла 0,3 с.

...