Tema SQL
SUBSTRING_INDEX() (MySQL / MariaDB)
Devuelve la subcadena antes de la enésima aparición de un delimitador, o después si el contador es negativo. Útil para parsear rutas, CSV rudimentario o URLs sin usar expresiones regulares.
Descripción
SUBSTRING_INDEX(str, delim, count) con count positivo devuelve todo lo que va antes del delimitador número count; con count negativo, devuelve la parte desde el final (últimos segmentos). Si el delimitador no aparece, devuelve la cadena completa. No interpreta comillas CSV ni escape: es división literal. Para datos estructurados complejos prefiere JSON_* o tablas normalizadas. Ojo con delimitadores multichar: solo usa el primer carácter en versiones antiguas según documentación — verifica la versión. Combina con TRIM para quitar espacios residuales.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
SUBSTRING_INDEX(cadena, delimitador, número)
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Contador positivo
- Cuenta desde la izquierda; devuelve prefijo hasta esa ocurrencia del delimitador.
- Contador negativo
- Cuenta desde la derecha; devuelve sufijo desde esa ocurrencia.
- Límites
- No valida formato de datos anidados; solo trocea por delimitador literal.
Ejemplos
Ejemplo 1
SELECT SUBSTRING_INDEX('a,b,c,d', ',', 2) AS prefijo;
-- a,b
SELECT SUBSTRING_INDEX('/var/www/html/index.php', '/', -1) AS archivo;
-- index.php
Ejemplo 2
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(url, '://', -1), '/', 1) AS host
FROM enlaces;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.