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 でない値を返す(標準、複数の引数)。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 COALESCE

PostgreSQL は標準の 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 mapping

Elasticsearch では、null または存在しないフィールドは 'exists' クエリで確認する(must_not exists = フィールドのないドキュメント)。COALESCE のようなデフォルト値には、マッピングで 'null_value' を定義するか、集計で 'missing' パラメータを使って欠けているエントリに値を割り当てる。デフォルト値は runtime field/スクリプトでも生成できる。

DBAtlas で開く →