SUBSTRING_INDEX

La función SUBSTRING_INDEX extrae una porción de una cadena antes o después de un número específico de apariciones de un delimitador.

Sintaxis

SUBSTRING_INDEX(cadena, delimitador, conteo)
  • conteo positivo: devuelve todo antes de la n-ésima aparición del delimitador
  • conteo negativo: devuelve todo después de la n-ésima aparición desde el final

Ejemplo básico

SELECT SUBSTRING_INDEX('www.mysql.com', '.', 1) AS resultado;
resultado
www
SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2) AS resultado;
resultado
www.mysql
-- Conteo negativo: desde el final
SELECT SUBSTRING_INDEX('www.mysql.com', '.', -1) AS resultado;
resultado
com
SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2) AS resultado;
resultado
mysql.com

Extraer dominio de email

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

Extraer nombre y apellido por separado

SELECT
    nombre,
    apellidos,
    SUBSTRING_INDEX(apellidos, ' ', 1) AS primer_apellido,
    SUBSTRING_INDEX(apellidos, ' ', -1) AS segundo_apellido
FROM clientes
LIMIT 5;
nombreapellidosprimer_apellidosegundo_apellido
MaríaGarcía LópezGarcíaLópez
CarlosRodríguez MartínRodríguezMartín
LauraLópez SánchezLópezSánchez
PedroFernández CastroFernándezCastro
AnaMartínez RuizMartínezRuiz

Parsear datos CSV

SELECT
    SUBSTRING_INDEX('iPhone,1299.99,50', ',', 1) AS nombre,
    SUBSTRING_INDEX(SUBSTRING_INDEX('iPhone,1299.99,50', ',', 2), ',', -1) AS precio,
    SUBSTRING_INDEX('iPhone,1299.99,50', ',', -1) AS stock;
nombrepreciostock
iPhone1299.9950

Extraer primera palabra del nombre del producto

SELECT
    nombre,
    SUBSTRING_INDEX(nombre, ' ', 1) AS marca
FROM productos
LIMIT 5;
nombremarca
iPhone 15 ProiPhone
MacBook Air M2MacBook
AirPods ProAirPods
iPad AiriPad
Apple Watch Series 9Apple

Cuando el delimitador no existe

Si el delimitador no se encuentra, devuelve la cadena completa:

SELECT SUBSTRING_INDEX('sin-punto', '.', 1) AS resultado;
resultado
sin-punto

En el siguiente artículo veremos REPLACE para sustituir texto dentro de una cadena.

Escrito por Eduardo Lázaro