| 資料庫 | 函數 | 語法 | 行為 | 備註 |
|---|---|---|---|---|
| SQL Server | ISNULL |
ISNULL(check_expr, replacement) |
check_expr 非 NULL 返回本身,否則返回 replacement |
僅 2 參數;replacement 必須隱式轉換為 check_expr 類型 |
| Oracle | NVL |
NVL(expr1, expr2) |
expr1 非 NULL 返回本身,否則返回 expr2 |
支援任意類型;雙 NULL 返回 NULL;常用於 NVL(col, 0) 參與運算 |
| MySQL | IFNULL |
IFNULL(expr1, expr2) |
expr1 非 NULL 返回本身,否則返回 expr2 |
返回類型取決於上下文 (數值/字串);COALESCE 為標準 SQL 多參數版本 |
-- 场景:訂單金額為 NULL 視為 0 參與統計
-- SQL Server
SELECT SUM(ISNULL(amount, 0)) FROM orders;
-- Oracle
SELECT SUM(NVL(amount, 0)) FROM orders;
-- MySQL
SELECT SUM(IFNULL(amount, 0)) FROM orders;
-- 或標準 SQL
SELECT SUM(COALESCE(amount, 0)) FROM orders; -- 三大庫通用
-- 取第一個非 NULL:手機 > 座機 > 郵箱 > '未提供'
-- MySQL / PostgreSQL / SQLite / Oracle 10g+ / SQL Server 2008+
SELECT COALESCE(mobile, phone, email, '未提供') FROM users;
-- SQL Server 專用 (巢狀 ISNULL)
SELECT ISNULL(mobile, ISNULL(phone, ISNULL(email, '未提供'))) FROM users;
-- Oracle 專用 (巢狀 NVL)
SELECT NVL(mobile, NVL(phone, NVL(email, '未提供'))) FROM users;
-- 通用 CASE 表達式 (ANSI SQL 標準)
SELECT CASE
WHEN mobile IS NOT NULL THEN mobile
WHEN phone IS NOT NULL THEN phone
WHEN email IS NOT NULL THEN email
ELSE '未提供'
END FROM users;
NULL = NULL → UNKNOWN (非 TRUE),永遠用 IS NULL / IS NOT NULLNOT IN (subquery) 子查詢含 NULL → 全集為空,改用 NOT EXISTSSUM/AVG/COUNT(col) **自動忽略 NULL**,COUNT(*) 計算行數含 NULLORDER BY col ASC NULL 排最前 (MySQL/SQL Server) 或最後 (Oracle/PostgreSQL),可用 NULLS FIRST/LAST 控制 (Oracle/PG)ISNULL (SQL Server) / NVL (Oracle) / IFNULL (MySQL) 核心語義一致:首參非空則取首參,否則取次參。跨庫開發首選 COALESCE (標準 SQL、多參數、可移植) 或 CASE (最靈活、可讀性最強)。