Buscar números de teléfono en la base de datos ignorando caracteres especiales

Tengo una tabla de base de datos de clientes donde los números de teléfono del cliente se almacenan en un campo llamado phoneNumber.

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

Quiero buscar clientes que tengan los mismos números de teléfono.

los números de teléfono pueden tener ‘-‘, ‘(‘, ‘)’, caracteres ESPACIALES. Quiero ignorar todos los caracteres excepto los números mientras busco.

Como se muestra en la base de datos, cuando quiero buscar el número de teléfono ‘0213383030’, todos estos clientes deben estar en el conjunto de resultados.

¿Puede sugerirme que consulte esto?

Método 1 : puede usar replace en la consulta para buscar. Por ejemplo: “Select * from customer where replace (phoneNumber, ‘-‘, ”) = ‘212-232-3333’ La desventaja de este método es que no podrá usar ningún índice, y la búsqueda será ( muy lento.

Método 2 : en una columna separada de la tabla, también mantenga una versión limpia del teléfono (columna artificial – “phoneNumberClean”) que no tenga ningún carácter especial. Cuando actualice registros en la columna principal, también actualice en la columna “limpiar”.

Método 3 : Un tercer método es crear un índice basado en función, que es posible en Oracle. Le permite buscar utilizando el método 1, sin tener una columna artificial del método 2, y aún tener búsquedas rápidas e indexadas. Pero, si está utilizando MySQL, entonces no puede usar este método ya que MySQL no admite índices basados ​​en funciones. Su mejor opción es usar la opción 2 (columna artificial) y usar un activador de actualización.

Puede usar el operador REGEXP (o su sinónimo RLIKE) en una cláusula WHILE. Para la expresión regular, ingrese [^0-9]* entre cada dígito del número que desea buscar. Por ejemplo:

 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]*' 

Es horrible, pero debería funcionar.

Puede limpiar el Número de teléfono antes de compararlo:

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

En cambio, agregaría otra columna a la tabla que contiene el número de teléfono pero sin los caracteres que no desea y luego usaré esa columna para las comparaciones.

Basado en la respuesta de Ted Hopp.

Script PHP para preparar cadenas de búsqueda:

 $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 

Funciona para todo tipo de formularios de números de teléfono guardados en DB, y para cualquier tipo de cadena de búsqueda.