Поиск номеров телефонов в базе данных, игнорирующих специальные символы

У меня есть таблица базы данных клиентов, где номера телефонов клиентов хранятся в поле с именем phoneNumber.

customerId | customerName | phoneNumber 1 Maulik 0213-383030 2 Maulik1 0-213-383030 3 Maulik2 (0213) 383030 

Я хочу искать клиентов, имеющих одинаковые номера телефонов.

номера телефонов могут иметь символы '-', '(', ')', SPACE. Я хочу игнорировать все символы, кроме чисел во время поиска.

Как показано в базе данных, когда я хочу найти номер телефона «0213383030», все эти клиенты должны быть в наборе результатов.

Можете ли вы предложить мне запрос для этого.

Метод 1 : вы можете использовать в запросе для поиска. Например: «Выберите * у клиента, где replace (phoneNumber, '-', '') = '212-232-3333' Недостатком этого метода является то, что вы не сможете использовать какой-либо индекс, и поиск будет ( очень медленно.

Способ 2. В отдельном столбце таблицы также сохраняйте чистую версию телефона (искусственный столбец – «phoneNumberClean»), который не имеет специальных символов. Когда вы обновляете записи в основном столбце, также обновляйте их в столбце «clean».

Метод 3 : Третий метод заключается в создании индекса на основе функций, который возможен в Oracle. Он позволяет выполнять поиск по методу 1 без искусственного столбца метода 2 и иметь быстрый, индексированный поиск. Но если вы используете MySQL, то вы не можете использовать этот метод, поскольку MySQL не поддерживает индексы на основе функций. Тогда ваш лучший вариант – использовать опцию 2 (искусственный столбец) и использовать триггер обновления.

Вы можете использовать оператор REGEXP (или синоним RLIKE) в предложении WHILE. Для регулярного выражения поставьте [^0-9]* между каждой цифрой числа, которое вы хотите найти. Например:

 SELECT * FROM customers WHERE phoneNumber RLIKE '[^0-9]*0[^0-9]*2[^0-9]*1[^0-9]*3[^0-9]*3[^0-9]*8[^0-9]*3[^0-9]*0[^0-9]*3[^0-9]*0[^0-9]*' 

Это ужасно, но это должно сработать.

Вы можете очистить номер телефона перед его сравнением:

 select * from table where replace(replace(replace(replace(phoneNumber,'('), ')'),' '), '-') = '0213383030'; 

Вместо этого я бы добавил еще один столбец в таблицу, содержащую номер телефона, но без символов, которые вы не хотите, а затем используйте этот столбец для сравнения.

На основании ответа Теда Хоппа.

PHP-скрипт для подготовки строки поиска:

 $str = '123-45-67'; // remove all except digits $maybe_phone = preg_replace("/[^0-9]+/", "", $str); // split string into array $digit_arr = str_split($maybe_phone); // put [^0-9]* around each digit of the number we want to find $phone_regexp = implode('[^0-9]*', $digit_arr); $phone_regexp = '[^0-9]*' . $phone_str . '[^0-9]*'; 

SQL

 SELECT * FROM customers WHERE phoneNumber RLIKE $phone_regexp 

Он работает для всех видов форм телефонного номера, сохраненных в БД, и для любой строки поиска.