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)conteopositivo: devuelve todo antes de la n-ésima aparición del delimitadorconteonegativo: 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;| dominio | usuario | |
|---|---|---|
| maria.garcia@email.com | email.com | maria.garcia |
| carlos.rodriguez@email.com | email.com | carlos.rodriguez |
| laura.lopez@email.com | email.com | laura.lopez |
| pedro.fernandez@email.com | email.com | pedro.fernandez |
| ana.martinez@email.com | email.com | ana.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;| nombre | apellidos | primer_apellido | segundo_apellido |
|---|---|---|---|
| María | García López | García | López |
| Carlos | Rodríguez Martín | Rodríguez | Martín |
| Laura | López Sánchez | López | Sánchez |
| Pedro | Fernández Castro | Fernández | Castro |
| Ana | Martínez Ruiz | Martínez | Ruiz |
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;| nombre | precio | stock |
|---|---|---|
| iPhone | 1299.99 | 50 |
Extraer primera palabra del nombre del producto
SELECT
nombre,
SUBSTRING_INDEX(nombre, ' ', 1) AS marca
FROM productos
LIMIT 5;| nombre | marca |
|---|---|
| iPhone 15 Pro | iPhone |
| MacBook Air M2 | MacBook |
| AirPods Pro | AirPods |
| iPad Air | iPad |
| Apple Watch Series 9 | Apple |
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
