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 でない値を返す(標準、複数の引数)。Oracle の NVL(a,b) は 2 引数の同等関数で、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 を提供する。Oracle の NVL の代わりに COALESCE を使用する。NULL の比較には = ではなく IS を使用する。2 つの 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) は 2 引数のショートカット(Oracle の NVL に類似)。<=> 演算子は NULL セーフな等価比較を提供する(2 つの 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(複数の引数、データ型の昇格あり)と 2 引数の ISNULL(a,b) を提供する。両者は微妙に異なる(COALESCE は標準で、型の優先順位に関してより柔軟)。NULLIF と IS NULL もサポートされる。ISNULL は Oracle の NVL に相当する(名前が似ている)。
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/missing でない最初の値を返す)。クエリでは、{ 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 には SQL の意味での NULL はない。相当するのは存在しないキーや存在しない 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 mappingElasticsearch では、null または存在しないフィールドは 'exists' クエリで確認する(must_not exists = フィールドのないドキュメント)。COALESCE のようなデフォルト値には、マッピングで 'null_value' を定義するか、集計で 'missing' パラメータを使って欠けているエントリに値を割り当てる。デフォルト値は runtime field/スクリプトでも生成できる。