У меня есть таблица базы данных клиентов, где номера телефонов клиентов хранятся в поле с именем 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
Он работает для всех видов форм телефонного номера, сохраненных в БД, и для любой строки поиска.