DBAtlas · Атлас эксплуатации баз данных

Обработка 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;

Для обработки NULL (неизвестного значения): COALESCE возвращает первое не-NULL значение в списке (стандарт, несколько аргументов). NVL(a,b) в Oracle — эквивалент с двумя аргументами; NVL2 возвращает разные значения в зависимости от того, NULL ли значение. NULLIF(a,b) возвращает NULL, если они равны. Всегда проверяйте NULL через IS NULL / IS NOT NULL (= NULL не работает).

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 предлагает стандартные COALESCE, NULLIF и IS NULL/IS NOT NULL; вместо NVL из Oracle используйте COALESCE. Для сравнения с NULL используйте IS, а не =; если два NULL нужно считать равными, подойдёт оператор 'IS NOT DISTINCT FROM'.

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 поддерживают стандартные COALESCE и NULLIF; IFNULL(a,b) — сокращение с двумя аргументами (похоже на NVL в Oracle). Оператор <=> обеспечивает NULL-безопасное равенство (считает два NULL равными). NULL проверяется через 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 предлагает стандартный COALESCE (несколько аргументов, с повышением типа данных) и ISNULL(a,b) с двумя аргументами; они тонко различаются (COALESCE стандартен и гибче в приоритете типов). Поддерживаются также NULLIF и IS NULL. ISNULL — эквивалент NVL в Oracle (названия похожи).

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] } })

В агрегации MongoDB эквивалент COALESCE — оператор $ifNull (несколько аргументов, возвращает первый, который не null/не отсутствует). В запросе { field: null } совпадает и с документами со значением null, и с документами, где поля нет вовсе; явно различайте их через { field: { $type: 'null' } } или $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 нет NULL в смысле SQL; эквивалент — отсутствующий ключ или отсутствующее поле Hash, и в этом случае команды возвращают nil. Логика значения по умолчанию (как COALESCE) применяется на стороне приложения проверкой на nil. Наличие поля проверяется через 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

В Elasticsearch null или отсутствующие поля проверяются запросом 'exists' (must_not exists = документы без поля). Для значения по умолчанию в стиле COALESCE задайте 'null_value' в mapping или присвойте значение отсутствующим записям параметром 'missing' в агрегациях. Значения по умолчанию можно также получать через runtime fields/скрипты.

Открыть в DBAtlas →