DBAtlas · Atlas de operações de banco de dados

Tratamento 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 desconhecido): COALESCE retorna o primeiro valor não NULL da lista (padrão, vários argumentos). O NVL(a,b) do Oracle é o equivalente de dois argumentos; NVL2 retorna valores diferentes conforme o valor seja NULL ou não. NULLIF(a,b) retorna NULL se forem iguais. Sempre teste NULL com IS NULL / IS NOT NULL (= NULL não 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

O PostgreSQL oferece COALESCE, NULLIF e IS NULL/IS NOT NULL padrão; use COALESCE em vez do NVL do Oracle. Use IS, e não =, em comparações com NULL; se dois NULLs precisarem ser tratados como iguais, o operador 'IS NOT DISTINCT FROM' resolve.

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;

O MySQL/MariaDB suportam COALESCE e NULLIF padrão; IFNULL(a,b) é um atalho de dois argumentos (semelhante ao NVL do Oracle). O operador <=> fornece igualdade segura para NULL (trata dois NULLs como iguais). NULL é testado com 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;

O SQL Server oferece o COALESCE padrão (vários argumentos, com promoção de tipo de dado) e o ISNULL(a,b) de dois argumentos; os dois diferem em detalhes sutis (COALESCE é padrão e mais flexível quanto à precedência de tipos). NULLIF e IS NULL também são suportados. ISNULL é o equivalente ao NVL do Oracle (os nomes são 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] } })

Na agregação do MongoDB, o equivalente ao COALESCE é o operador $ifNull (vários argumentos, retorna o primeiro que não seja null/ausente). Em uma consulta, { field: null } corresponde tanto aos documentos cujo valor é null quanto aos que não têm o campo; explicite a distinção com { field: { $type: 'null' } } ou $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)

O Redis não tem NULL no sentido do SQL; o equivalente é uma chave ou um campo de Hash ausente, e os comandos retornam nil nesse caso. A lógica de valor padrão (como COALESCE) é aplicada no lado da aplicação com uma verificação de nil. A existência de um campo é verificada com 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

No Elasticsearch, campos null ou ausentes são verificados com a consulta 'exists' (must_not exists = documentos sem o campo). Para um padrão semelhante a COALESCE, defina 'null_value' no mapping ou atribua um valor às entradas ausentes com o parâmetro 'missing' nas agregações. Valores padrão também podem ser gerados com runtime fields/scripts.

Abrir no DBAtlas →