Herramientas

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

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

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Migrar tslane a un paquete dual CommonJS y ESM con tsup y Vitest

tslane es la plantilla que uso como punto de partida para mis librerías TypeScript, nacida…

5 días ago

Cómo construir tu primer scorecard paso a paso

En los artículos anteriores de esta serie vimos la teoría detrás del credit scoring: qué…

7 días ago

Actualizar expresslanets a ES Modules con tsx y Vitest

expresslanets es la plantilla de API REST con Express y TypeScript que empezó como una…

2 semanas ago

Pareto/NBD: cuando el abandono silencioso cambia el CLV

En el artículo del Dashboard vimos que Pareto/NBD aparecía junto a BG/NBD con un ajuste…

2 semanas ago

Por qué migrar tus proyectos TypeScript a ES Modules en 2026

Durante años, CommonJS (require/module.exports) ha sido la forma por defecto de organizar módulos en Node.js,…

3 semanas ago

Método del codo: interpretación correcta y limitaciones

Cuando usas k-means tienes que decidir algo incómodo de entrada: cuántos grupos, , vas a…

3 semanas ago

This website uses cookies.