首页 > 数据库 > 数据库开发技术 > 五种主流数据库:条件表达式
| 条件表达式 | MySQL | Oracle | SQL Server | PostgreSQL | SQLite |
|---|---|---|---|---|---|
| 简单 CASE 表达式 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 搜索 CASE 表达式 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| nullif 函数 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| coalesce 函数 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 专有函数 | if、ifnull | decode、nvl、nvl2 | isnull、iif | ifnull、iif |
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
[ELSE default]
END
SELECT emp_name,
CASE dept_id
WHEN 1 THEN '行政管理部'
WHEN 2 THEN '人力资源部'
WHEN 3 THEN '财务部'
WHEN 4 THEN '研发部'
WHEN 5 THEN '销售部'
WHEN 6 THEN '保卫部'
ELSE '其他部门'
END AS "部门名称"
FROM employee;
员工姓名|部门编号|部门名称
------|-------|--------
刘备 | 1|行政管理部
关羽 | 2|行政管理部
张飞 | 3|行政管理部
诸葛亮 | 4|人力资源部
黄忠 | 5|人力资源部
魏延 | 6|人力资源部
孙尚香 | 7|财务部
孙丫鬟 | 8|财务部
...
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
[ELSE default]
END
SELECT emp_name AS "员工姓名",emp_id AS "部门编号",
CASE
WHEN dept_id = 1 THEN '行政管理部'
WHEN dept_id = 2 THEN '人力资源部'
WHEN dept_id = 3 THEN '财务部'
WHEN dept_id = 4 THEN '研发部'
WHEN dept_id = 5 THEN '销售部'
WHEN dept_id = 6 THEN '保卫部'
ELSE '其他部门'
END AS "部门名称"
FROM employee;
SELECT emp_name AS "员工姓名",salary AS "月薪",
CASE
WHEN salary < 10000 THEN '低收入'
WHEN salary < 20000 THEN '中收入'
ELSE '高收入'
END AS "收入级别"
FROM employee;
员工姓名|月薪 |收入级别
------|--------|-------
刘备 |30000.00|高收入
关羽 |26000.00|高收入
张飞 |24000.00|高收入
诸葛亮 |24000.00|高收入
黄忠 | 8000.00|低收入
魏延 | 7500.00|低收入
孙尚香 |12000.00|中收入
孙丫鬟 | 6000.00|低收入
...
SELECT emp_name AS "员工姓名",
CASE
WHEN bonus IS NULL THEN 0
ELSE bonus
END AS "奖金"
FROM employee
WHERE dept_id = 2
ORDER BY CASE
WHEN bonus IS NULL THEN 0
ELSE bonus
END;
员工姓名|奖金
------|-------
黄忠 | 0
魏延 | 0
诸葛亮 |8000.00
截至 2020 年入职年限不满 10 年的员工,男性员工的礼品为手表一块,女性员工的礼品为化妆品一套;
截至 2020 年入职年限满 10 年且不满 15 年的员工,男性员工的礼品为手机一部,女性员工的礼品为项链一条;
截至 2020 年入职年限满 15 年的员工,不论男女,礼品统一为电脑一台。
-- Oracle、MySQL 以及 PostgreSQL
SELECT emp_name AS "员工姓名", hire_date AS "入职日期",
CASE
WHEN EXTRACT(YEAR FROM hire_date)> 2011 AND sex = '男' THEN '手表'
WHEN EXTRACT(YEAR FROM hire_date) > 2011 AND sex = '女' THEN '化妆品'
WHEN EXTRACT(YEAR FROM hire_date) > 2006 AND sex = '男' THEN '手机'
WHEN EXTRACT(YEAR FROM hire_date) > 2006 AND sex = '女' THEN '项链'
ELSE '电脑'
END AS "礼品"
FROM employee;
员工姓名|入职日期 |礼品
------|----------|---
刘备 |2000-01-01|电脑
关羽 |2000-01-01|电脑
张飞 |2000-01-01|电脑
...
廖化 |2009-02-17|手机
关平 |2011-07-24|手机
赵氏 |2011-11-10|项链
...
-- Microsoft SQL Server
SELECT emp_name AS "员工姓名", hire_date AS "入职日期",
CASE
WHEN DATEPART(YEAR, hire_date) > 2011 AND sex = '男' THEN '手表'
WHEN DATEPART(YEAR, hire_date) > 2011 AND sex = '女' THEN '化妆品'
WHEN DATEPART(YEAR, hire_date) > 2006 AND sex = '男' THEN '手机'
WHEN DATEPART(YEAR, hire_date) > 2006 AND sex = '女' THEN '项链'
ELSE '电脑'
END AS "礼品"
FROM employee;
-- SQLite
SELECT emp_name AS "员工姓名", hire_date AS "入职日期",
CASE
WHEN CAST(STRFTIME('%Y', hire_date) AS INT) > 2011 AND sex = '男' THEN '手表'
WHEN CAST(STRFTIME('%Y', hire_date) AS INT) > 2011 AND sex = '女' THEN '化妆品'
WHEN CAST(STRFTIME('%Y', hire_date) AS INT) > 2006 AND sex = '男' THEN '手机'
WHEN CAST(STRFTIME('%Y', hire_date) AS INT) > 2006 AND sex = '女' THEN '项链'
ELSE '电脑'
END AS "礼品"
FROM employee;
SELECT NULLIF(1, 2), NULLIF(2, 2)
FROM employee
WHERE emp_id = 1;
NULLIF(1,2)|NULLIF(2,2)
-----------|-----------
1| |
-- 除零错误
SELECT *
FROM employee
WHERE 1 / 0 = 1;
-- 避免除零错误
SELECT *
FROM employee
WHERE 1 / NULLIF(0 , 0) = 1;
SELECT emp_name AS "员工姓名",
salary*12 + bonus AS "全年收入",
salary*12 + COALESCE(bonus, 0) AS "全年收入"
FROM employee
WHERE dept_id = 2;
员工姓名|全年收入 |全年收入
-------|---------|---------
诸葛亮 |296000.00 |296000.00
黄忠 | | 96000.00
魏延 | | 90000.00
SELECT emp_name AS "员工姓名",
COALESCE(bonus, 0) AS "奖金"
FROM employee
WHERE dept_id = 2
ORDER BY COALESCE(bonus, 0);
员工姓名|奖金
------|-------
黄忠 | 0
魏延 | 0
诸葛亮 |8000.00
-- MySQL
SELECT IF(1<2, '1<2', '1>=2') AS result;
result
------
1<2
-- MySQL 和 SQLite
SELECT emp_name AS "员工姓名",
salary*12 + IFNULL(bonus, 0) AS "全年收入"
FROM employee
WHERE dept_id = 2;
DECODE(expression, value1, result1, value2, result2, ...[, default ])
-- Oracle
SELECT emp_name,
DECODE(dept_id, 1, '行政管理部', 2, '人力资源部',
3 ,'财务部', 4, '研发部',
5, '销售部', 6, '保卫部', '其他部门'
) AS "部门名称"
FROM employee;
-- Oracle
SELECT emp_name AS "员工姓名",
salary*12 + NVL(bonus, 0) AS "全年收入"
FROM employee
WHERE dept_id = 2;
-- Oracle
SELECT emp_name AS "员工姓名",
NVL2(bonus, salary*12 + bonus, salary*12) AS "全年收入"
FROM employee
WHERE dept_id = 2;
-- Microsoft SQL Server
SELECT emp_name AS "员工姓名",
salary*12 + ISNULL(bonus, 0) AS "全年收入"
FROM employee
WHERE dept_id = 2;
-- Microsoft SQL Server 和 SQLite
SELECT IIF(1<2, '1<2', '1>=2') AS result;
原文作者:SQL编程思想;如有侵权,请联系管理员删除。