Обработка 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 COALESCEPostgreSQL предлагает стандартные 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/скрипты.