SUBSTRING

La función SUBSTRING, con su alias SUBSTR, extrae una porción de una cadena a partir de una posición dada. Es la más flexible de las funciones de extracción de texto de MySQL: mientras que LEFT y RIGHT solo toman los extremos, SUBSTRING puede empezar en cualquier punto y tomar la longitud que quieras.

Dos detalles marcan la diferencia entre usarla bien o mal. El primero es que las posiciones empiezan en 1, no en 0 como en muchos lenguajes de programación. El segundo es que admite posiciones negativas para contar desde el final, una capacidad muy útil que no todos conocen. Combinada con funciones de búsqueda como INSTR, SUBSTRING permite extraer partes de un texto cuya posición no conoces de antemano, como el dominio de un email. En este artículo veremos sus tres formas sintácticas, las posiciones negativas y sus usos prácticos.

Sintaxis

SUBSTRING ofrece varias formas equivalentes. Puedes indicar solo la posición de inicio (extrae hasta el final), añadir una longitud, o usar la sintaxis con FROM y FOR heredada del estándar SQL.

-- Desde una posición hasta el final
SUBSTRING(cadena, posicion)
 
-- Desde una posición con longitud específica
SUBSTRING(cadena, posicion, longitud)
 
-- Sintaxis alternativa con FROM/FOR
SUBSTRING(cadena FROM posicion)
SUBSTRING(cadena FROM posicion FOR longitud)

El detalle más importante a recordar es que las posiciones empiezan en 1, no en 0.

Ejemplo básico

Indicando solo la posición de inicio, SUBSTRING extrae desde ahí hasta el final de la cadena. Empezando en la posición 7 obtenemos la palabra Tutorial:

SELECT SUBSTRING('MySQL Tutorial', 7) AS resultado;
resultado
Tutorial

Añadiendo una longitud, se limita el número de caracteres extraídos. Aquí tomamos cinco caracteres desde el principio:

SELECT SUBSTRING('MySQL Tutorial', 1, 5) AS resultado;
resultado
MySQL

Posiciones negativas

Una capacidad muy práctica de SUBSTRING es aceptar posiciones negativas, que se cuentan desde el final de la cadena. Una posición de -8 significa "empieza en el octavo carácter contando desde atrás":

SELECT SUBSTRING('MySQL Tutorial', -8) AS resultado;
resultado
Tutorial

Las posiciones negativas también se pueden combinar con una longitud, lo que permite extraer un fragmento concreto situado cerca del final:

SELECT SUBSTRING('Hola mundo', -5, 3) AS resultado;
resultado
mun

Extraer partes de un texto

Sobre columnas, SUBSTRING extrae la porción indicada de cada valor, por ejemplo los primeros caracteres de un nombre de producto:

SELECT
    nombre,
    SUBSTRING(nombre, 1, 6) AS primeros_6
FROM productos
LIMIT 5;
nombreprimeros_6
iPhone 15 ProiPhone
MacBook Air M2MacBoo
AirPods ProAirPod
iPad AiriPad A
Apple Watch Series 9Apple

Extraer dominio y usuario de un email

Aquí SUBSTRING despliega todo su potencial al combinarse con INSTR. Como no sabemos en qué posición está la arroba de cada email, usamos INSTR para localizarla y SUBSTRING para extraer lo que viene después, obteniendo así el dominio:

SELECT
    email,
    SUBSTRING(email, INSTR(email, '@') + 1) AS dominio
FROM clientes
LIMIT 5;
emaildominio
maria.garcia@email.comemail.com
carlos.rodriguez@email.comemail.com
laura.lopez@email.comemail.com
pedro.fernandez@email.comemail.com
ana.martinez@email.comemail.com

La parte del usuario se obtiene de forma simétrica: extrayendo desde el principio hasta justo antes de la arroba, indicando como longitud la posición de la arroba menos uno:

SELECT
    email,
    SUBSTRING(email, 1, INSTR(email, '@') - 1) AS usuario
FROM clientes
LIMIT 5;
emailusuario
maria.garcia@email.commaria.garcia
carlos.rodriguez@email.comcarlos.rodriguez
laura.lopez@email.comlaura.lopez
pedro.fernandez@email.compedro.fernandez
ana.martinez@email.comana.martinez

SUBSTRING con NULL

Como el resto de funciones de cadena, propaga el valor NULL: si la entrada es nula, el resultado también lo es:

SELECT SUBSTRING(NULL, 1, 5) AS resultado;
resultado
NULL

SUBSTRING, LEFT y RIGHT

SUBSTRING es la función general de la que LEFT y RIGHT son casos particulares. La siguiente tabla muestra esa relación:

FunciónUso
LEFT(cadena, n)Equivale a SUBSTRING(cadena, 1, n)
RIGHT(cadena, n)Equivale a SUBSTRING(cadena, -n)
SUBSTRING(cadena, pos, len)Extrae desde cualquier posición

LEFT y RIGHT son atajos más legibles para los extremos, pero SUBSTRING es lo que necesitas en cuanto el punto de inicio está en mitad de la cadena.

Errores comunes

El error más habitual es el desfase por la indexación basada en 1. Quien viene de lenguajes donde las cadenas empiezan en la posición 0 tiende a equivocarse en un carácter, sobre todo al calcular longitudes combinando SUBSTRING con INSTR. Recuerda siempre que el primer carácter está en la posición 1.

El segundo descuido es no contemplar el caso de que la subcadena buscada no exista cuando combinas SUBSTRING con INSTR. Si INSTR devuelve 0 porque no encuentra la arroba, los cálculos de posición producen resultados inesperados. En datos reales conviene validar antes que el separador existe, o usar SUBSTRING_INDEX, que gestiona esos casos con más elegancia.

Cuándo usar SUBSTRING

SUBSTRING es la herramienta indicada cuando necesitas extraer una porción que no está en los extremos de la cadena, o cuando el punto de inicio depende de la posición de otro carácter. Para quedarte solo con el principio o el final, LEFT y RIGHT son más concisos; y para dividir un texto por un delimitador, SUBSTRING_INDEX suele ser más práctico.

En el siguiente artículo veremos SUBSTRING_INDEX, que extrae partes de una cadena delimitadas por un separador.

Escrito por Eduardo Lázaro