Las cadenas son donde viven las consultas reales
Con los números es fácil. Lo complicado llega con las cadenas: nombres con espacios sobrantes, correos en mayúsculas y minúsculas mezcladas, identificadores pegados con guiones, campos de texto libre que casi —pero no del todo— coinciden. SQLite trae un conjunto pequeño y bien pensado de funciones de cadenas que resuelve la mayoría de estos casos sin tener que recurrir a código de aplicación.
En esta página repasamos las que más vas a usar: concatenar, recortar, buscar, reemplazar, limpiar y formatear.
Concatenar cadenas en SQLite con el operador ||
SQLite no tiene una función CONCAT. Para unir cadenas se usa el operador ||:
Los números y otros tipos se convierten a texto de forma automática. El detalle a tener en cuenta: si cualquiera de los operandos es NULL, toda la expresión se vuelve NULL. Es el comportamiento estándar de SQL, pero suele pillar desprevenido a más de uno:
Envuelve las columnas que admiten NULL con COALESCE(col, '') o COALESCE(col, 'valor_por_defecto') cuando no quieras que un valor ausente te reviente toda la cadena.
LENGTH, UPPER y LOWER
Estas tres las vas a usar todo el tiempo:
LENGTH devuelve la cantidad de caracteres del texto, no los bytes. Si lo que quieres son bytes (un caso poco común, pero útil para analizar almacenamiento), usa OCTET_LENGTH. Por defecto, UPPER y LOWER solo transforman letras ASCII: los caracteres acentuados pasan tal cual, salvo que tengas cargada la extensión ICU.
SUBSTR en SQLite: extraer parte de una cadena
SUBSTR(text, start, length) extrae un fragmento de una cadena. Los índices empiezan en 1, no en 0 — es decir, 1 corresponde al primer carácter:
Algunas cosas que conviene tener presentes:
- El tercer argumento es opcional. Si lo omites, obtienes todo desde
starthasta el final de la cadena. - Un
startnegativo cuenta desde el final. - Si
startse pasa del final, te devuelve una cadena vacía, no un error.
SUBSTRING también se acepta como sinónimo, por si vienes con la memoria muscular de otra base de datos.
INSTR en SQLite: localizar una subcadena
INSTR(haystack, needle) devuelve la posición (empezando en 1) de la primera aparición de needle dentro de haystack, o 0 si no la encuentra:
Esa última expresión es el modismo clásico de SQLite para «todo lo que va antes de @»: localizas el delimitador con INSTR y cortas con SUBSTR. Vas a escribir esta combinación un montón de veces. Ojo con un detalle: cuando INSTR no encuentra nada devuelve 0, así que conviene comprobarlo antes de cortar — si le pasas 0 a SUBSTR, te devuelve resultados raros sin avisar.
REPLACE: reemplazar una subcadena por otra en SQLite
REPLACE(text, old, new) sustituye todas las apariciones de old por new:
Distingue entre mayúsculas y minúsculas, y no acepta expresiones regulares: solo busca subcadenas literales. Para transformaciones más complejas puedes encadenar varias llamadas a REPLACE, pero a partir de dos o tres anidadas conviene mover esa lógica a la aplicación.
TRIM, LTRIM y RTRIM en sqlite
Los datos que introduce el usuario suelen llegar con espacios sobrantes al principio o al final. TRIM se encarga de limpiarlos:
De forma predeterminada, eliminan espacios. Si pasas un segundo argumento, puedes indicar qué caracteres quitar: ojo, cada carácter de ese segundo argumento se interpreta como parte de un "conjunto de caracteres a eliminar", no como una subcadena literal. Por eso TRIM('xxxhelloxx', 'x') devuelve 'hola'.
printf en SQLite: formatear números y cadenas
Cuando necesitas dar formato a una cadena —decimales fijos, números con relleno, salida en hexadecimal—, la función printf (también disponible como format) es la indicada:
Los especificadores de formato siguen las convenciones de C, así que tienes %d, %s, %f, %x, relleno con 0 o espacios, etc. Esto resulta mucho más limpio que armar cadenas a base de || y una pila de CAST.
LIKE vs GLOB en SQLite: coincidencia de patrones
Dos operadores, dos mundos distintos.
LIKE usa los comodines clásicos de SQL — % para cualquier secuencia de caracteres y _ para un único carácter — y no distingue entre mayúsculas y minúsculas en ASCII:
GLOB usa los comodines típicos de la shell de Unix: * para cualquier secuencia, ? para un solo carácter y [abc] para clases de caracteres. Eso sí, distingue entre mayúsculas y minúsculas:
La regla para elegir entre ambos: usa LIKE para coincidencias al estilo humano tipo "empieza con", "contiene" o "termina con". Usa GLOB cuando importe distinguir mayúsculas y minúsculas o cuando necesites clases de caracteres. Ambos pueden aprovechar índices, pero solo si el patrón está anclado al inicio ('foo%', no '%foo'); un comodín al principio obliga a escanear toda la tabla.
Dividir cadenas en SQLite: aquí no hay SPLIT
SQLite no trae una función SPLIT_STRING. Los dos apaños prácticos son:
Para dividir una cadena por un delimitador y obtener varias filas, lo más limpio es usar json_each sobre un array JSON, o bien una CTE recursiva. Veremos ambos enfoques en capítulos posteriores; por ahora basta con que sepas que "dame cada palabra" no se resuelve en una sola línea en SQLite.
Ejemplo práctico: limpiar nombres
Vamos a juntar todo lo visto. Imagina una tabla users con nombres para mostrar hechos un desastre: espacios de sobra, mayúsculas y minúsculas mezcladas y títulos opcionales tipo "Dr. " o "Mr. " que quieres quitar:
La expresión se lee de adentro hacia afuera: primero quitamos los espacios externos, pasamos a minúsculas, eliminamos los títulos y volvemos a recortar por si al quitar el título quedó un espacio al inicio. Cada paso es una sola función — la complejidad aparece al apilarlas. Cuando la pila pasa de tres o cuatro niveles, es buena señal para usar una columna generada (Capítulo: Características avanzadas) o hacer la limpieza durante la importación de datos.
Lo que te llevas
||para concatenar;NULLenvenena el resultado, así que recurre aCOALESCE.SUBSTReINSTRjuntos cubren la mayoría de los casos de "buscar y cortar".REPLACEsustituye todas las apariciones de una subcadena literal.TRIMy compañía aceptan un conjunto de caracteres personalizado, no solo espacios en blanco.printfes la herramienta adecuada para dar formato a la salida.LIKEpara comodines SQL sin distinguir mayúsculas,GLOBpara patrones tipo shell que sí distinguen mayúsculas.
Siguiente: funciones numéricas
Resueltas las cadenas, la parada obvia son los números: redondeos, valores absolutos, peculiaridades de la división y las funciones matemáticas que SQLite agregó en versiones recientes. Eso lo vemos en la próxima página.
Preguntas frecuentes
¿Cómo se concatenan cadenas en SQLite?
Con el operador ||, no con CONCAT. SQLite no trae una función CONCAT de serie: 'Hola, ' || nombre une las dos cadenas en una sola. Ojo con los NULL: si cualquiera de los operandos es NULL, el resultado entero será NULL, así que envuelve las columnas que puedan ser nulas con COALESCE cuando ese no sea el comportamiento que buscas.
¿Cómo extraigo una subcadena en SQLite?
Usa SUBSTR(texto, inicio, longitud), también escrito como SUBSTRING. Los índices empiezan en 1: SUBSTR('hola', 1, 3) devuelve 'hol'. Si el inicio es negativo, cuenta desde el final, y el argumento de longitud es opcional: si lo omites, te da todo hasta el final de la cadena.
¿Tiene SQLite una función SPLIT_STRING?
No, SQLite no incluye ninguna función para dividir cadenas. En la mayoría de los casos puedes combinar INSTR y SUBSTR para sacar el trozo que te interesa, o tirar de un CTE recursivo para partir por un delimitador. Si lo necesitas a menudo, suele salir más limpio usar json_each sobre un array JSON que montar tu propio splitter.
¿Cuál es la diferencia entre LIKE y GLOB en SQLite?
LIKE ignora mayúsculas y minúsculas para ASCII por defecto y usa % y _ como comodines. GLOB, en cambio, distingue mayúsculas y emplea los comodines del shell de Unix (*, ?, [abc]). Tira de GLOB cuando necesites distinguir mayúsculas o usar clases de caracteres, y de LIKE para el matching clásico al estilo SQL.