Имею 2 варианта:
Вариант 1. Хранить сами номера телефонов «поциферно» — в 10 полях таблицы (D0, D1, ..., D9), по 1 полю на каждую цифру номера. Произвести индексацию по этим полям.
Плюсы: при поиске будут использоваться индексы.
Минусы: растет размер таблицы, растет время обновления данных при вставке/замене и т.д.
Пример для маски 911-AAA-X-BBB:
SELECT * FROM table WHERE D0=9 AND D1=1 AND D2=1 AND D3=D4 AND D4=D5 AND D7=D8 AND D8=D9
Вариант 2. При вводе маски (в основной программе) заранее подготовить список ВСЕХ (не обязательно содержащихся в таблице) номеров, удовлетворяющих маске, и использовать уже этот список в WHERE.
Плюсы: при поиске будет использоваться индекс.
Минусы: при «слабой» маске, таких номеров в списке может оказаться довольно много и сам текст запроса получится невообразимо большим.
Этот метод будет хорош, когда маска «сильная», например: 911-AAAAAA-X (всего порядка 100 вариантов)
Пример для маски 911-AAA-X-BBB:
SELECT * FROM table WHERE phone IN (9110001111, 9110001222, 9110001333, ...)