Aprende SQL · lección gratuita
Las funciones de texto manipulan cadenas: cambian mayúsculas, extraen fragmentos, buscan posiciones, reemplazan y concatenan. Son esenciales para limpiar datos (nombres con espacios, formatos inconsistentes) y para construir etiquetas legibles en reportes. SQLite trabaja sobre TEXT con un conjunto compacto de funciones que se combinan entre sí.
UPPER(s) / LOWER(s): pasan a mayúsculas/minúsculas. Útiles para comparaciones insensibles a caso y para normalizar.LENGTH(s): número de caracteres de la cadena.SUBSTR(s, inicio, largo): extrae una subcadena. El índice empieza en 1, no en 0. SUBSTR('Nexus', 1, 3) → 'Nex'.INSTR(s, sub): posición (base 1) de la primera aparición de sub en s, o 0 si no existe. Se combina con SUBSTR para cortar por un separador.REPLACE(s, viejo, nuevo): reemplaza todas las ocurrencias de un fragmento.TRIM(s): elimina espacios al inicio y al final (LTRIM/RTRIM solo un lado). Acepta un segundo argumento con los caracteres a recortar.||: operador de concatenación (nombre || ' (' || cargo || ')').A diferencia de muchos lenguajes de programación, en SQL las posiciones de cadena empiezan en 1. SUBSTR(s, 1, 1) es el primer carácter. Con índice negativo cuentas desde el final: SUBSTR('correo', -3) devuelve los últimos 3 caracteres ('reo'). Si omites el largo, SUBSTR toma desde inicio hasta el final.
Para obtener el nombre de pila a partir de 'Elena Ríos', buscas el primer espacio con INSTR(nombre, ' ') y cortas hasta antes de él: SUBSTR(nombre, 1, INSTR(nombre, ' ') - 1). Este patrón es muy frecuente para separar campos compuestos.
Cuidado: en SQLite, concatenar con || y un valor NULL produce NULL ('a' || NULL → NULL). Si una columna puede ser NULL al concatenar (típico tras un LEFT JOIN), envuélvela en COALESCE(col, '') para no perder toda la cadena. Esto se ve en la lección 12.
Para comparar texto sin importar el caso, transforma ambos lados: WHERE LOWER(pais) = 'perú'. SQLite por defecto compara TEXT sensible al caso para caracteres no-ASCII, por eso normalizar con LOWER/UPPER da resultados consistentes.
SELECT nombre, UPPER(cargo) AS cargo_upper, LENGTH(nombre) AS largo FROM empleados LIMIT 5
-- Construir una etiqueta legible por empleado y extraer su nombre de pila.
-- INSTR localiza el primer espacio; SUBSTR corta hasta antes de él.
SELECT
nombre,
UPPER(nombre) AS en_mayusculas,
LENGTH(nombre) AS largo,
SUBSTR(nombre, 1, INSTR(nombre, ' ') - 1) AS nombre_pila,
nombre || ' — ' || cargo AS etiqueta
FROM empleados
ORDER BY id
LIMIT 8;
-- REPLACE para normalizar: generar un "slug" simple del nombre del producto.
-- Reemplazamos espacios por guiones y pasamos a minúsculas.
SELECT
nombre,
LOWER(REPLACE(nombre, ' ', '-')) AS slug
FROM productos
ORDER BY id
LIMIT 6;
-- Código de cliente: primera letra de la empresa + dos letras del país.
SELECT
empresa,
pais,
UPPER(SUBSTR(empresa, 1, 1)) || '/' || UPPER(SUBSTR(pais, 1, 2)) AS codigo
FROM clientes
ORDER BY id
LIMIT 6;
-- Generar un correo ficticio: primera palabra del nombre en minúsculas + dominio.
SELECT
nombre,
LOWER(SUBSTR(nombre, 1, INSTR(nombre, ' ') - 1)) || '@nexus.com' AS correo
FROM empleados
ORDER BY id
LIMIT 6;
💡 Recuerda queSUBSTReINSTRusan índices base 1. El bug típico es restar 1 de más o de menos al cortar por separador. YREPLACEcambia todas las apariciones, no solo la primera: si quieres reemplazar una sola, necesitas lógica conSUBSTR.
| Función | Qué hace | ||
|---|---|---|---|
UPPER(s) / LOWER(s) | Mayúsculas / minúsculas | ||
LENGTH(s) | Cantidad de caracteres | ||
SUBSTR(s, i, n) | Subcadena desde i (base 1), n caracteres | ||
INSTR(s, sub) | Posición (base 1) de sub, o 0 si no está | ||
REPLACE(s, a, b) | Cambia todas las ocurrencias de a por b | ||
TRIM(s) / LTRIM / RTRIM | Quita espacios (ambos lados / izquierda / derecha) | ||
| `a \ | \ | b` | Concatena cadenas |
---