Las Funciones escalares son aquellas que toman un solo valor de entrada y devuelven un solo valor de salida.
A veces, no basta con hacer un SELECT Columna. A menudo necesitamos transformar esa columna antes de enviarla a la aplicación.
A diferencia de las funciones agregadas (como SUM o COUNT) que colapsan muchas filas en una sola, las funciones escalares se aplican fila a fila. Si tu consulta devuelve 1.000 filas, la función se ejecutará 1.000 veces.
Vamos a ver las imprescindibles, divididas por categorías.
Funciones de texto
El manejo de cadenas (strings) es probablemente la tarea más común. Limpiar nombres, formatear códigos o extraer partes de un texto.
Nos devuelve el número de caracteres de una cadena. Nota: Ignora los espacios en blanco al final.
SELECT LEN('Hola Mundo'); -- Devuelve 10
Indispensables para normalizar datos antes de compararlos o mostrarlos.
SELECT
Nombre,
UPPER(Nombre) AS NombreMayus,
LOWER(Apellido) AS ApellidoMinus
FROM Clientes;
Obtiene una porción de texto. Sus parámetros son: Texto, PosiciónInicio, Longitud.
-- Extraer las 3 primeras letras (ej: "Lui")
SELECT SUBSTRING('Luis Llamas', 1, 3);
Sustituye todas las ocurrencias de un texto por otro. Muy útil para limpiar datos sucios.
-- Cambiar guiones por barras
SELECT REPLACE('2023-10-01', '-', '/'); -- Devuelve '2023/10/01'
A menudo los usuarios meten espacios sin querer al principio o final (' Luis ').
LTRIM: Quita espacios a la izquierda.RTRIM: Quita espacios a la derecha.TRIM: (Desde SQL Server 2017) Quita de ambos lados.
SELECT TRIM(' Dato Sucio '); -- Devuelve 'Dato Sucio'
Funciones matemáticas
Aunque la base de datos no es una calculadora científica, necesitamos realizar operaciones aritméticas básicas y redondeos.
Devuelve el valor positivo de un número.
SELECT ABS(-150.50); -- Devuelve 150.50
Redondea un número a una cantidad específica de decimales. Ojo: Redondea matemáticamente (0-4 baja, 5-9 sube).
SELECT ROUND(123.4567, 2); -- Devuelve 123.4600
A diferencia de ROUND, estos fuerzan el redondeo hacia una dirección.
CEILING: Redondea hacia arriba al entero más cercano.FLOOR: Redondea hacia abajo al entero más cercano.
SELECT CEILING(10.1); -- Devuelve 11
SELECT FLOOR(10.9); -- Devuelve 10
Para cálculos más complejos. POWER(Base, Exponente) y SQRT(Numero).
SELECT POWER(2, 3); -- 2 elevado a 3 = 8
SELECT SQRT(16); -- Raíz cuadrada de 16 = 4
Funciones de fecha y hora
El manejo de fechas suele ser una pesadilla en programación, pero SQL Server tiene herramientas muy potentes para facilitarlo.
Devuelve la fecha y hora actual del servidor. Es la función que usarás para guardar el momento de creación de un registro (FechaRegistro).
SELECT GETDATE(); -- Ej: 2023-10-05 14:30:00.123
Permite sumar (o restar) intervalos de tiempo a una fecha. Sintaxis: DATEADD(Intervalo, Cantidad, Fecha).
-- Sumar 7 días a hoy (Vencimiento en una semana)
SELECT DATEADD(DAY, 7, GETDATE());
-- Restar 1 mes (Hace un mes)
SELECT DATEADD(MONTH, -1, GETDATE());
Calcula cuánto tiempo ha pasado entre dos fechas. Sintaxis: DATEDIFF(Intervalo, FechaInicio, FechaFin).
-- Calcular edad (Diferencia en años)
SELECT DATEDIFF(YEAR, '1990-05-20', GETDATE());
-- Días transcurridos desde el inicio de año
SELECT DATEDIFF(DAY, '2023-01-01', GETDATE());
Cuidado con DATEDIFF: Esta función cuenta cruces de fronteras. DATEDIFF(YEAR, '2023-12-31', '2024-01-01') devuelve 1, aunque solo haya pasado un día, porque ha cruzado la frontera del año.
Son atajos para sacar partes de una fecha.
SELECT
YEAR(FechaPedido) AS Anio,
MONTH(FechaPedido) AS Mes
FROM Pedidos;
Introducida en versiones modernas, devuelve el último día del mes de una fecha dada. Utilísima para facturación.
-- Último día del mes actual
SELECT EOMONTH(GETDATE());
Ejemplo combinado
Vamos a poner todo junto en una consulta. Imaginad que generamos un reporte de usuarios.
SELECT
-- Texto: Nombre en mayúsculas y eliminamos espacios
UPPER(TRIM(Nombre)) AS NombreLimpio,
-- Texto: Creamos un código con las 3 primeras letras
SUBSTRING(Apellido, 1, 3) + CAST(UsuarioID AS VARCHAR) AS CodigoUsuario,
-- Fecha: Calculamos la antigüedad en días
DATEDIFF(DAY, FechaRegistro, GETDATE()) AS DiasAntiguedad,
-- Matemáticas: Redondeamos su saldo
ROUND(SaldoCuenta, 0) AS SaldoRedondeado
FROM Usuarios
WHERE Activo = 1;
Con estas funciones, transformamos datos crudos en información lista para consumir. Pero hay un pequeño detalle en el ejemplo anterior: CAST. ¿Qué hace ahí? Eso nos lleva al siguiente tema.
