DBAtlas · Atlas de operaciones de bases de datos

Tratamiento de NULL (COALESCE/NVL/NULLIF/IS NULL)

Oracle

-- COALESCE: returns the first non-NULL value (standard)
SELECT name, COALESCE(phone, mobile, 'none') AS contact FROM customer;

-- Oracle-specific NVL / NVL2
SELECT NVL(balance, 0) FROM customer;
SELECT NVL2(discount, 'yes', 'no') FROM orders;

-- NULLIF and IS NULL
SELECT NULLIF(a, b) FROM t;   -- NULL if a=b
SELECT name FROM customer WHERE phone IS NULL;

Para tratar NULL (valor desconocido): COALESCE devuelve el primer valor no NULL de la lista (estándar, varios argumentos). NVL(a,b) de Oracle es el equivalente de dos argumentos; NVL2 devuelve valores distintos según el valor sea NULL o no. NULLIF(a,b) devuelve NULL si son iguales. Compruebe siempre NULL con IS NULL / IS NOT NULL (= NULL no funciona).

PostgreSQL

SELECT name, COALESCE(phone, mobile, 'none') AS contact FROM customer;
SELECT NULLIF(divisor, 0) FROM t;   -- prevent division by zero
SELECT name FROM customer WHERE phone IS NULL;
-- The equivalent of Oracle NVL is COALESCE

PostgreSQL ofrece COALESCE, NULLIF e IS NULL/IS NOT NULL estándar; use COALESCE en lugar de NVL de Oracle. Use IS, no =, para las comparaciones con NULL; si dos NULL deben tratarse como iguales, el operador 'IS NOT DISTINCT FROM' cumple esa función.

MySQL

SELECT name, COALESCE(phone, mobile, 'none') AS contact FROM customer;

-- MySQL shortcut: IFNULL (two arguments)
SELECT IFNULL(balance, 0) FROM customer;
SELECT NULLIF(a, b) FROM t;
SELECT name FROM customer WHERE phone IS NULL;

MySQL/MariaDB admiten COALESCE y NULLIF estándar; IFNULL(a,b) es un atajo de dos argumentos (similar a NVL de Oracle). El operador <=> proporciona igualdad segura frente a NULL (trata dos NULL como iguales). NULL se comprueba con IS NULL / IS NOT NULL.

SQL Server

SELECT name, COALESCE(phone, mobile, 'none') AS contact FROM customer;

-- SQL Server shortcut: ISNULL (two arguments)
SELECT ISNULL(balance, 0) FROM customer;
SELECT NULLIF(a, b) FROM t;
SELECT name FROM customer WHERE phone IS NULL;

SQL Server ofrece COALESCE estándar (varios argumentos, con promoción de tipos de datos) e ISNULL(a,b) de dos argumentos; ambos difieren en aspectos sutiles (COALESCE es estándar y más flexible con la precedencia de tipos). También se admiten NULLIF e IS NULL. ISNULL es el equivalente de NVL de Oracle (los nombres son parecidos).

MongoDB

// COALESCE equivalent: $ifNull
db.customer.aggregate([
  { $project: { name: 1,
      contact: { $ifNull: ["$phone", "$mobile", "none"] } } }
])
// NULL / missing field check:
db.customer.find({ phone: { $in: [null] } })

En la agregación de MongoDB, el equivalente de COALESCE es el operador $ifNull (varios argumentos, devuelve el primero que no sea null/ausente). En una consulta, { field: null } coincide tanto con los documentos cuyo valor es null como con los que carecen por completo del campo; haga explícita la distinción con { field: { $type: 'null' } } o $exists.

Redis

# Instead of NULL, Redis has the concept of 'no such key/field':
EXISTS customer:1              # does the key exist?
HGET customer:1 phone        # returns nil if the field is absent
GET missing_key                  # (nil)

Redis no tiene NULL en el sentido de SQL; el equivalente es una clave inexistente o un campo de Hash inexistente, y en ese caso los comandos devuelven nil. La lógica de valor por defecto (como COALESCE) se aplica en la aplicación comprobando nil. La existencia de un campo se comprueba con HEXISTS.

Elasticsearch

# Default assignment when a field is missing (missing bucket / null_value)
# Find documents without the field in a query:
GET customer/_search
{ "query": { "bool": { "must_not": { "exists": { "field": "phone" } } } } }
# Map empty values to a specific value with null_value in the mapping

En Elasticsearch, los campos null o ausentes se comprueban con la consulta 'exists' (must_not exists = documentos sin el campo). Para un valor por defecto tipo COALESCE, defina 'null_value' en el mapping, o asigne un valor a las entradas ausentes con el parámetro 'missing' en las agregaciones. También se pueden generar valores por defecto con runtime fields/scripts.

Abrir en DBAtlas →