首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server、Oracle、MySQL 三大資料庫 NULL 值替換函數對比:ISNULL / NVL / IFNULL

     編輯:MySQL 資料庫相關知識

三大資料庫 NULL 處理函數速查表

資料庫函數語法行為備註
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;  -- 三大庫通用

進階:多級回退 (COALESCE / CASE)

-- 取第一個非 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 = NULL → UNKNOWN (非 TRUE),永遠用 IS NULL / IS NOT NULL
  • NOT IN (subquery) 子查詢含 NULL → 全集為空,改用 NOT EXISTS
  • 聚合函數 SUM/AVG/COUNT(col) **自動忽略 NULL**,COUNT(*) 計算行數含 NULL
  • ORDER BY col ASC NULL 排最前 (MySQL/SQL Server) 或最後 (Oracle/PostgreSQL),可用 NULLS FIRST/LAST 控制 (Oracle/PG)

總結

ISNULL (SQL Server) / NVL (Oracle) / IFNULL (MySQL) 核心語義一致:首參非空則取首參,否則取次參。跨庫開發首選 COALESCE (標準 SQL、多參數、可移植) 或 CASE (最靈活、可讀性最強)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved