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 veces es 0 o negativo, devuelve una cadena vacía
  • Si cadena o veces es NULL, devuelve NULL

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;
nombrestockbarra
iPhone 15 Pro50█████
MacBook Air M230███
AirPods Pro100██████████
iPad Air25██
Apple Watch Series 945████

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;
ceronegativolongitud
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