Funciones de manipulación de cadenas para extraer la ciudad a partir de la dirección

Es habitual tener un campo con direcciones en tablas de una BD. La dirección puede contener la calle, la ciudad… Esta lección te muestra cómo obtener solo la ciudad a partir de la dirección completa.

Nota: esta lección asume que se emplea MySQL. Aunque con otros gestores de BD las funciones son ligeramente diferentes, la explicación sería similar.

Supongamos que en una tabla de una BD tenemos un campo llamado direccion que almacena direcciones con el siguiente formato (calle número, ciudad):

Calle Ramón y Cajal 13, Alfaro
Avenida San Martín 3, Logroño
Arenal 7, Madrid

La ciudad está separada de la calle por una coma y un espacio.

Supongamos que tenemos que obtener la ciudad de una determinada dirección. Para ello (en MySQL) podemos usar la siguiente expresión:  

substring(direccion, instr(direccion,',')+2)

¿De dónde sale esto? ¿Cómo funciona? Primero recordemos lo que hace cada función por separado:

  • instr(<cad>, <subcad>) devuelve el índice de comienzo de una subcadena en una cadena. P.ej., instr('Hola', 'la') devuelve 3, porque la 'la' comienza en el índice 3 de la cadena 'Hola'. Por cierto, instr viene de in-string (dentro de la cadena)
  • substring(<cadena>, <inicio>, <N>) devuelve un trozo de la <cadena> que comienza en el índice <inicio> y tiene <N> caracteres. Si no se indica este tercer argumento, se devuelve un trozo de la cadena que comienza en el índice <inicio> y llega hasta el final. P.ej., substring('Hola', 2) devuelve 'ola'.
Expliquemos ahora cómo funciona la expresión anterior. Supongamos que como valor de dirección tuviésemos 'Arenal 7, Madrid'. Entonces substring(direccion, instr(direccion,',')+2) devolverá 'Madrid'. Veamos porqué:
  • instr(direccion,',') sirve para buscar la posición de la ',', que es el caracter que aproximadamente marca el inicio de la ciudad dentro de la dirección. En este caso devolverá 9, porque la ',' está en la posición 9 de la cadena 'Arenal 7, Madrid'.
  • En nuestro formato de fechas, la ciudad comienza dos posiciones más allá de la ','. Por eso añadimos el “+2”. Así, substring(direccion, instr(direccion,',')+2) = substring(direccion, 9+2) = substring(direccion, 11) 
  • La posición 11 de la cadena 'Arenal 7, Madrid' es la que ocupa la 'M' de 'Madrid'.
  • Por ello substring(direccion, 11) devuelve desde la 'M' hasta el final. Es decir, devuelve 'Madrid'.
Lo anterior funciona para cualquier valor de dirección que se ajuste al formato indicado anteriormente.

Saber sacar la ciudad de una dirección con funciones no significa que haya que hacerlo siempre

Aunque tengamos un martillo, no todo son clavos. Hemos aprendido a usar la expresión anterior, pero habrá ocasiones en las que no necesitarás usarla. P.ej., si nos pidieran la lista de personas que viven en Alfaro, no es necesario hacer esto (aunque sea correcto):

MEJORABLE
select *
from Persona
where substring(direccion, instr(direccion,',')+2) = 'Alfaro';

Basta con un comodín % y un like

MEJOR
select *
from Persona
where direccion like '%, Alfaro';

No hay comentarios:

Publicar un comentario