Funciones de NULL — Referencia de SQL en Marketing Cloud
Manejo de NULL en MC SQL — ISNULL, COALESCE, NULLIF, más la regla para elegir COALESCE sobre ISNULL, el idiom de NULLIF para división segura, y la diferencia entre ISNULL la función y IS NULL el operador.
El manejo de NULL es una categoría de bugs más que una categoría de funciones. MC SQL te da tres herramientas — ISNULL, COALESCE, NULLIF — y cada una tiene un filo. ISNULL es la conveniencia de dos argumentos de T-SQL que coerce tipos en silencio según el primer argumento. COALESCE es la versión multi-argumento de SQL estándar que es portátil y predecible. NULLIF hace el inverso: convierte un valor específico de vuelta a NULL, que es el truco para división segura y patrones de "tratar string vacío como faltante".
Sintaxis oficial
-- ISNULL: T-SQL, dos args, devuelve replacement si value es NULL
SELECT ISNULL(LoyaltyTier, 'standard') AS Tier
FROM master_subscribers;
-- COALESCE: SQL estándar, múltiples args, devuelve el primer no-NULL
SELECT COALESCE(LoyaltyTier, MarketingTier, 'standard') AS Tier
FROM master_subscribers;
-- NULLIF: devuelve NULL cuando los dos args son iguales, si no el primer arg
SELECT NULLIF(EmailAddress, '') AS EmailOrNull
FROM master_subscribers;
-- Protección contra división por cero vía NULLIF
SELECT
TotalSpend / NULLIF(LoyaltyPoints, 0) AS SpendPerPoint
FROM master_subscribers;
-- Combinado: tratar string vacío como NULL, después default
SELECT COALESCE(NULLIF(LoyaltyTier, ''), 'standard') AS Tier
FROM master_subscribers;El set soportado:
| Función | Qué hace | Devuelve |
|---|---|---|
| ISNULL(value, replacement) | Devuelve replacement si value es NULL, si no value | Tipo de value (1er arg) |
| COALESCE(v1, v2, ..., vn) | Devuelve el primer valor no-NULL | Tipo del arg de mayor precedencia |
| NULLIF(v1, v2) | Devuelve NULL si v1 = v2, si no v1 | Tipo de v1 |
| IS NULL (operador) | Test booleano, true cuando el valor es NULL | (Usado en WHERE, no es función) |
| IS NOT NULL (operador) | Test booleano, true cuando el valor es no-NULL | (Usado en WHERE, no es función) |
ISNULL (función) y IS NULL (operador) son cosas distintas a pesar del solapamiento de nombres. ISNULL(x, y) sustituye un valor; WHERE x IS NULL filtra filas. Las dos aparecen en la misma query y confundirlas produce bugs silenciosos.
Referencia:
Lo que sobrevive en producción
COALESCE sobre ISNULL para código nuevo
Tres razones por las que COALESCE es el mejor default:
- Multi-argumento:
COALESCE(a, b, c, 'default')cascadea por los fallbacks.ISNULLsolo toma dos. - SQL estándar:
COALESCEes portable a cualquier dialecto SQL;ISNULLes T-SQL específico. El código que sobrevive una migración de plataforma arranca acá. - Tipos predecibles:
ISNULLdevuelve el tipo del primer argumento, lo que puede truncar silenciosamente al segundo.COALESCEdevuelve el tipo de mayor precedencia entre todos los argumentos.
-- EN RIESGO — ISNULL devuelve el tipo del primer arg (VARCHAR(5)),
-- así que 'standard-tier' (más largo que 5 chars) se trunca a 'stand'
SELECT ISNULL(CAST(LoyaltyTier AS VARCHAR(5)), 'standard-tier') AS Tier
FROM master_subscribers;
-- Devuelve 'stand', no 'standard-tier'
-- DURABLE — COALESCE evalúa tipos entre todos los args, devuelve el más ancho
SELECT COALESCE(CAST(LoyaltyTier AS VARCHAR(5)), 'standard-tier') AS Tier
FROM master_subscribers;
-- Devuelve 'standard-tier' como esperabasEl caso de truncación es artificial pero la diferencia subyacente de coerción de tipos es real. Default a COALESCE y evitás la categoría de sorpresa entera.
NULLIF para división segura y patrones de centinela-como-faltante
Dividir por cero en MC SQL tira error y mata la Activity. El idiom defensivo es NULLIF(divisor, 0) — si el divisor es cero, la división se vuelve value / NULL, que es NULL, que es benigno aguas abajo (con un COALESCE para defaultearlo).
-- EN RIESGO — división por cero mata la Activity para cualquier fila donde
-- LoyaltyPoints es 0
SELECT TotalSpend / LoyaltyPoints AS SpendPerPoint
FROM master_subscribers;
-- DURABLE — NULLIF convierte el 0 en NULL, la división se vuelve NULL,
-- COALESCE defaultéa a 0 (o el centinela que tenga sentido)
SELECT COALESCE(TotalSpend / NULLIF(LoyaltyPoints, 0), 0) AS SpendPerPoint
FROM master_subscribers;El otro uso mayor de NULLIF: convertir strings vacíos en NULL así son manejados por el resto de tu lógica NULL-aware.
-- EN RIESGO — los strings vacíos cuentan como "valor válido" en filtros WHERE
SELECT SubscriberKey
FROM master_subscribers
WHERE LoyaltyTier IS NOT NULL;
-- Devuelve filas donde LoyaltyTier = '' (vacío), que probablemente no era lo que querías
-- DURABLE — convertí '' a NULL antes del check IS NOT NULL
SELECT SubscriberKey
FROM master_subscribers
WHERE NULLIF(LoyaltyTier, '') IS NOT NULL;
-- Ahora los strings vacíos se tratan correctamente como faltantesISNULL (función) vs IS NULL (operador) — son cosas distintas
Las dos aparecen en la misma query y confundirlas es un bug silencioso y común.
-- ISNULL función — sustituye un valor
SELECT ISNULL(LoyaltyTier, 'standard') AS Tier
FROM master_subscribers;
-- IS NULL operador — filtra filas
SELECT SubscriberKey
FROM master_subscribers
WHERE LoyaltyTier IS NULL;
-- BUG — confusión común: ISNULL en un WHERE no filtra, sustituye
SELECT SubscriberKey
FROM master_subscribers
WHERE ISNULL(LoyaltyTier, 'gold') = 'gold';
-- Esto devuelve subscribers donde LoyaltyTier es 'gold' O NULL
-- (porque NULL se sustituye a 'gold'), que rara vez es la intención.Cuando el objetivo es filtrar, usá IS NULL / IS NOT NULL. Cuando el objetivo es proveer un valor default en una proyección, usá COALESCE (o ISNULL si aceptás sus limitaciones).
COALESCE evalúa argumentos lazy pero coerce tipos eager
COALESCE(a, b, c) deja de evaluar cuando encuentra un no-NULL — pero el tipo del resultado se determina por el tipo de mayor precedencia entre todos los argumentos, sin importar cuál termine devolviéndose. Si un argumento fuerza un tipo que no encaja con tu data, la sorpresa no es el valor, es el tipo.
-- COALESCE elige el tipo de resultado de todos los args, no solo del que devuelve
SELECT COALESCE(NULL, '42', 100) AS Result;
-- Todos los args evaluados por tipo, INT (100) gana, '42' coerced a 42, devuelve 42
-- Si necesitás un tipo de output específico, casteá explícitamente
SELECT CAST(COALESCE(NULL, '42', '100') AS INT) AS Result; -- args string, después castCuando las columnas de origen son tipos mezclados, casteá adentro de la llamada COALESCE así estás vos en control del tipo, no las reglas de coerción.
Decisión rápida
Usá COALESCE cuando:
- Default. Código nuevo. Multi-argumento. Tipo-predecible.
Usá ISNULL cuando:
- Default de dos argumentos y verificaste explícitamente que el comportamiento de coerción de tipo matchea lo que querés. Raro.
Usá NULLIF cuando:
- Protegés contra división por cero (
/ NULLIF(divisor, 0)). - Tratás valores centinela (string vacío,
'unknown',-1) como NULL así son manejados por la lógica NULL-aware.
Usá IS NULL / IS NOT NULL (operador) cuando:
- Filtrás filas en
WHERE. Nunca lo confundas con la funciónISNULL.
Casteá adentro de COALESCE cuando:
- Las columnas de origen son tipos mezclados y querés control explícito sobre el tipo de resultado.
Relacionado
- Basics — subset de T-SQL soportado
- SELECT —
COALESCEen proyección - WHERE — operadores
IS NULL/IS NOT NULL(vs la funciónISNULL) - CASE — alternativa a
COALESCEpara condiciones más complejas - Funciones agregadas — envolvé agregados en
COALESCEpara manejar result sets vacíos - Funciones numéricas —
NULLIF(divisor, 0)para división segura - Funciones de conversión — patrón
COALESCE(TRY_CAST(...), default) - MC SQL gotchas — ver #5 para lógica NULL de tres valores transversal al lenguaje
Progreso del catálogo: Con esta página, las 6 referencias de funciones están completas. El trabajo restante del catálogo es la SQL Style Guide (la pieza opinionada que une todo) más 3 snippets de debugging how-to.