REPEAT
La función REPEAT construye una nueva cadena repitiendo otra un número determinado de veces. Es la herramienta natural para generar relleno, separadores visuales, datos de prueba o representaciones gráficas sencillas dentro de una consulta, sin necesidad de recurrir a la aplicación.
Su utilidad va más allá de lo decorativo. Permite, por ejemplo, generar rápidamente una cadena de longitud conocida para probar los límites de una columna, crear máscaras de relleno, o dibujar barras proporcionales a un valor numérico directamente en el resultado de una consulta, algo muy práctico para informes en la consola. En este artículo veremos su sintaxis, sus casos de borde con cero y NULL, varios usos prácticos y un límite importante que conviene conocer al repetir cadenas muy largas.
Sintaxis
REPEAT recibe la cadena a repetir y el número de repeticiones. El resultado es la concatenación de la cadena consigo misma esa cantidad de veces.
REPEAT(cadena, veces)Su comportamiento en los casos límite es predecible y conviene tenerlo claro de antemano:
- Si
veceses 0 o negativo, devuelve una cadena vacía - Si
cadenaovecesesNULL, devuelveNULL
Ejemplo básico
En su forma más simple, repite una cadena el número de veces indicado. El resultado es la unión directa, sin separadores entre repeticiones:
SELECT REPEAT('Ha', 3) AS resultado;| resultado |
|---|
| HaHaHa |
Repetir un único carácter es la base para construir líneas y máscaras de longitud fija:
SELECT REPEAT('*', 10) AS estrellas;| estrellas |
|---|
| ********** |
Generar separadores
Un uso habitual en informes y volcados por consola es crear líneas divisorias de un ancho concreto, mucho más cómodo que teclear los guiones a mano:
SELECT REPEAT('-', 40) AS linea;| linea |
|---|
| ---------------------------------------- |
Visualizar stock con barras
REPEAT permite dibujar barras proporcionales a un valor. Para evitar que una cifra alta genere una barra desmesurada, conviene acotar la longitud con LEAST, que limita el número de bloques a un máximo. Combinado con RPAD podrías además igualar todas las barras al mismo ancho:
SELECT
nombre,
stock,
REPEAT('█', LEAST(stock / 10, 15)) AS barra
FROM productos
LIMIT 5;| nombre | stock | barra |
|---|---|---|
| iPhone 15 Pro | 50 | █████ |
| MacBook Air M2 | 30 | ███ |
| AirPods Pro | 100 | ██████████ |
| iPad Air | 25 | ██ |
| Apple Watch Series 9 | 45 | ████ |
Visualizar puntuación de reseñas
La misma idea sirve para representar valoraciones con estrellas. Aquí un INNER JOIN cruza las reseñas con los productos para mostrar la puntuación de cada uno como una fila de estrellas:
SELECT
p.nombre,
r.puntuacion,
REPEAT('★', r.puntuacion) AS estrellas
FROM resenas r
JOIN productos p ON r.producto_id = p.id
LIMIT 5;REPEAT con 0 o negativo
Cuando el número de repeticiones es 0 o negativo, REPEAT no falla ni devuelve NULL: devuelve una cadena vacía, que es distinta de NULL. El siguiente ejemplo lo confirma midiendo su longitud con LENGTH:
SELECT
REPEAT('X', 0) AS cero,
REPEAT('X', -1) AS negativo,
LENGTH(REPEAT('X', 0)) AS longitud;| cero | negativo | longitud |
|---|---|---|
| 0 |
Este detalle es útil porque te permite usar REPEAT con un contador variable sin preocuparte de los valores no positivos: simplemente no producirá relleno.
REPEAT con NULL
Si cualquiera de los dos argumentos es NULL, el resultado es NULL, siguiendo la regla general de propagación de nulos de las funciones de cadena:
SELECT REPEAT(NULL, 5) AS resultado;| resultado |
|---|
| NULL |
Errores comunes
El tropiezo más importante con REPEAT no es de sintaxis, sino de límites de tamaño. Una cadena repetida muchas veces puede crecer enormemente, y si el resultado supera el valor de la variable max_allowed_packet, MySQL devuelve NULL y registra una advertencia en lugar de la cadena gigante esperada. Por eso, al generar relleno o datos de prueba con un número de repeticiones muy alto, conviene comprobar que no se rebasa ese límite.
Otro descuido habitual es esperar algún separador entre las repeticiones. REPEAT concatena la cadena directamente, sin nada en medio. Si necesitas un separador (por ejemplo, comas), tendrás que incluirlo dentro de la propia cadena que repites y luego recortar el sobrante del final.
Cuándo usar REPEAT
REPEAT encaja siempre que necesites una cadena de longitud variable formada por un patrón que se repite: relleno, máscaras, separadores, visualizaciones tipo barra o generación de datos de prueba de un tamaño concreto. Para rellenar una cadena existente hasta una longitud fija por la izquierda o la derecha, suele ser más directo usar LPAD o RPAD, que están pensados justo para eso.
En el siguiente artículo veremos FORMAT, que da formato legible a los números con separadores de miles y decimales.
Escrito por Eduardo Lázaro
