Truco SQL: Búsqueda fonética en SQL Server

Publicado el 13 noviembre 2020 por Daniel Rodríguez @analyticslane

Una tarea más complicada de lo que podríamos pensar es buscar nombres en una base de datos. Especialmente si no están en nuestro idioma y sabemos cómo se escriben correctamente. La solución en este caso es emplear un algoritmo fonético, como puede ser el caso de SOUNDEX, para buscar por su sonido, no por su escritura. Afortunadamente para los usuarios de SQL Server están disponibles las funciones SOUNDEX y DIFFERENCE con las que respectivamente se obtiene el índice SOUNDEX de una cadena y la diferencia entre dos, respectivamente. Así que podemos usar la función DIFFERENCE para realizar una búsqueda fonética en SQL Server.

El código SOUNDEX

Al aplicar el algoritmo SOUNDEX una cadena de texto este genera un código que consiste en una letra seguida de tres números. Siendo la letra la primera del nombre y los números codifican el resto de las consonantes. Así, por ejemplo, el nombre "Rodríguez" tiene asociado el código R362, al igual que "Rodrigues". Aunque no sean el mismo apellido. Por otro lado, otro apellido como "Diez" tiene asociado el código D200.

El grado de similitud de dos cadenas de texto se miden por el número coincidencias en la cadena. En los ejemplos anteriores, "Rodríguez" y "Rodrigues" tienen el mismo código, por lo que su grado de coincidencia es 4. Mientras que "Diez" no se parece en nada a los anteriores, por lo que el grado de coincidencia es 0. Siendo este el valor que devuelve la función DIFFERENCE.

Buscar en un nombre

Ahora que entendemos lo que hace la función DIFFERENCE se puede usar para realizar una búsqueda fonética en SQL Server. Simplemente tenemos que escribir una consulta como la siguiente.

SELECT last_name FROM clients WHERE DIFFERENCE(last_name, 'Rodríguez') = 4

En la que se exige que el código SOUNDEX sea el mismo en ambos casos.

Buscar en una cadena de caracteres completo

La consulta anterior se puede utilizar cuando se busca un nombre en un campo. Pero qué pasa si en el campo está el nombre completo. En este caso el algoritmo solo se aplicará al primer nombre, ya que este generará un único código. Para solucionar esto se puede dividir el nombre completo con STRING_SPLIT y comparar todas las subcadenas.

SELECT full_name FROM clients
OUTER APPLY STRING_SPLIT(full_name, ' ') a
WHERE DIFFERENCE(a.value, 'Rodríguez') = 4

Conclusiones

Ahora ya sabemos cómo hacer una búsqueda fonética en SQL Server. Aunque el algoritmo SOUNDEX está diseñado para funcionar en inglés, es una buena aproximación a la hora de hacer búsquedas en cadenas de texto.

Imagen de Theodor Moise en Pixabay