К сожалению не сильно знаком с DB2, но думаю подходы примерно одинаковые.
Во-первых, поиск можно сделать регистронезависимым на уровне БД или таблицы. В MSSQL он по-умолчанию регистронезависимый. Гуглить по словам COLLATION COLLATE.
Например посмотреть тут.
Ну а дальше можно использовать алгоритмы нечёткого поиска.
Достаточно подробно в соответствующей
статье на Хабре.
Если у вас БД небольшая (до тысяч фамилий), то можно её банально пробежать и сравнить с искомой по расстоянию Дамерау-Левенштейна. Оформить можно функцией. Работать будет примерно так:
SELECT * FROM People WHERE Distance(People.Family, 'Иванов') < 2
Если сравнение по расстоянию занимает много времени, то можно применить алгоритм триграмм.
Повесить триггер на вставку/изменение: генерировать по фамилии триграммы и складывать в отдельную таблицу.
Тогда для поиска необходимо искомую фамилию также разложить на триграммы и искать их в таблице триграмм.
Примерная фамилия должна соответствовать почти всем искомым триграммам.
Можно использовать механизмы свёрток, по типу SOUNDEX, но они дают большой шум и работают хорошо только при записи фамилий на слух.