课程
在 SQL 查询中直接实现条件逻辑是数据科学家和数据工程师必备的技能。本文将全面介绍如何在 Oracle 中使用 SQL DECODE() 函数。我还会将 DECODE() 与 Oracle 中的 CASE WHEN 进行对比,帮助您理解各自的适用场景。最后,我将提供在 SQL Server、PostgreSQL 和 MySQL 中实现等效转换的代码。
在开始实践示例之前,建议先学习 DataCamp 的 Introduction to Oracle SQL 课程,回顾 PL/SQL 方言的使用。此外,我们的 Intermediate SQL 课程将帮助您掌握处理包含 DECODE() 函数查询所需的更高级 SQL 技能,因为正如我们将看到的,DECODE() 常与子查询等更高级语法结合使用。
如何使用 SQL DECODE() 函数
SQL 的 DECODE() 函数在 Oracle 数据库中原生支持,属于 PL/SQL 方言的一部分。DECODE() 函数允许在查询中实现条件逻辑。这一技术对于从数据库检索记录时进行数据转换非常重要。
考虑下面的 employees 表,其中 department_id 为数值。我们希望将 department_id 转换为 department_name,并使用更易理解的类别。

使用 SQL DECODE() 函数进行转换的示例表。图片由作者提供。
下面的示例展示了如何使用 DECODE() 函数将 department_id 转换为实际名称。
-- Using DECODE to transform department_id to department_name
SELECT
employee_id,
first_name,
last_name,
DECODE(department_id,
1, 'IT',
2, 'HR',
3, 'Finance',
4, 'Marketing',
5, 'Sales',
'Unknown') AS department_name,
salary,
hire_date,
city
FROM employees;

使用 SQL DECODE() 函数后的示例输出表。图片由作者提供。
理解 SQL DECODE() 函数
DECODE() 函数在 Oracle 数据库中可用,可用于基于条件逻辑转换列。DECODE() 允许在一个简单的查询中进行多重条件转换。
DECODE() 函数的语法如下:
DECODE(expression, search1, result1, search2, result2, ..., default)
其中:
-
expression:要比较的值。 -
search:与表达式进行比较的值。 -
result:当表达式与搜索值匹配时返回的值。 -
default:当未找到匹配时返回的值(可选)。
使用 SQL DECODE() 的高级技巧与注意事项
可以使用 DECODE() 函数执行一些高级 SQL 操作。这些高级技巧可实现更复杂的条件逻辑转换。
将 DECODE() 与聚合函数结合使用
Oracle 中的 DECODE() 函数既可在 SELECT 语句中用于重新分类变量,也可与聚合函数一起用于更复杂的分组,从而进一步提升灵活性与结果的可解释性。
在以下查询中,我们使用 DECODE() 将 department_id 转换为 department_name。同时,使用 DECODE() 将平均工资分为 “High Paying” 或 “Low Paying”。
SELECT
department_id,
-- Use DECODE to transform department_id into department_name
DECODE(
department_id,
1, 'IT',
2, 'HR',
3, 'Finance',
4, 'Marketing',
5, 'Sales',
'Unknown'
) AS department_name,
SUM(salary) AS total_salary,
-- Calculate the average salary for each department and round to nearest integer
ROUND(AVG(salary), 0) AS average_salary,
-- Use DECODE to categorize average salary into 'High Paying' or 'Low Paying'
DECODE(
SIGN(AVG(salary) - 65000),
1, 'High Paying',
0, 'High Paying',
-1, 'Low Paying'
) AS salary_category
FROM
employees
GROUP BY
department_id;

使用多个 SQL DECODE() 函数后的示例表输出。图片由作者提供
嵌套的 DECODE() 语句
将 DECODE() 与子查询结合使用,可以对数据执行更复杂的条件逻辑转换。当我们需要在一张表中评估多个条件时,Oracle 中的嵌套 DECODE() 语句会很有帮助。
在下面的示例中,我们使用嵌套的 DECODE() 语句根据部门与工资对员工进行分类。
-- Select the columns
SELECT
employee_id,
first_name,
last_name,
department_id,
salary,
-- Use DECODE to categorize salary based on department and salary thresholds
DECODE(department_id,
1, DECODE( -- If department_id is 1 (IT)
CASE
WHEN salary > 65000 THEN 'High'
ELSE 'Low'
END,
'High', 'IT High Salary',
'Low', 'IT Low Salary'
),
2, DECODE( -- If department_id is 2 (HR)
CASE
WHEN salary > 55000 THEN 'High'
ELSE 'Low'
END,
'High', 'HR High Salary',
'Low', 'HR Low Salary'
),
3, DECODE( -- If department_id is 3 (Finance)
CASE
WHEN salary > 70000 THEN 'High'
ELSE 'Low'
END,
'High', 'Finance High Salary',
'Low', 'Finance Low Salary'
),
4, DECODE( -- If department_id is 4 (Marketing)
CASE
WHEN salary > 68000 THEN 'High'
ELSE 'Low'
END,
'High', 'Marketing High Salary',
'Low', 'Marketing Low Salary'
),
5, DECODE( -- If department_id is 5 (Sales)
CASE
WHEN salary > 60000 THEN 'High'
ELSE 'Low'
END,
'High', 'Sales High Salary',
'Low', 'Sales Low Salary'
),
'Unknown Department' -- Default value if department_id does not match any case
) AS salary_category
FROM
employees;

使用嵌套 DECODE() 函数后的示例表输出。图片由作者提供
DECODE() 如何处理 NULL 值
DECODE() 函数在两方面对 NULL 值有特殊处理。一方面,DECODE() 会将两个 NULL 视为相等。这意味着当列值与 NULL 比较时,NULL 会被视为匹配。不过,如果在转换中未显式考虑 NULL,也要警惕可能出现的意外结果,因为这可能会掩盖 NULL 值。
此外,与 CASE WHEN 语句类似,如果未找到匹配项,DECODE() 函数会返回 NULL。
下面的示例展示了当 department_id 和 salary 缺失时,DECODE() 函数如何返回空值。
-- Select columns
SELECT
employee_id,
first_name,
last_name,
department_id,
salary,
-- Determine the salary category based on the salary value
DECODE(salary,
NULL, 'No Salary Information',
60000, 'Standard Salary',
'Other Salary') AS salary_category,
-- Determine the department name based on the department ID
DECODE(department_id,
1, 'IT',
2, 'HR',
3, 'Finance',
4, 'Marketing',
5, 'Sales') AS department_name
-- If department_id does not match any of the above, return NULL
FROM
employees;

使用 DECODE() 处理 NULL 值后的示例表输出。图片由作者提供
Oracle 中的 DECODE 与 CASE WHEN
DECODE() 是较早被引入的函数,尽管后来被 CASE WHEN 语句所取代,但在某些场景下仍然更受青睐。例如,当逻辑较为简单时,DECODE() 语法更简洁,可读性更强。
此外,DECODE() 通常更快,因为它作为内置函数经过性能优化,尽管差异可能微乎其微。最后,在一些遗留的 Oracle 系统中,您可能必须使用 DECODE() 作为内置函数。
其他数据库中可替代 DECODE() 的方法
DECODE() 函数仅在 Oracle 数据库中受支持。然而,SQL Server、PostgreSQL 和 MySQL 提供了应用条件数据转换逻辑的替代方法。
在数据转换中,DECODE() 很有用,因为它通过省去 IF ELSE 或 CASE 语句来简化复杂逻辑。DECODE() 还能提升查询的可读性,从而更高效地进行数据处理。下面我们来看看 DECODE() 的不同用例。
在 SQL Server、PostgreSQL 和 MySQL 中使用 CASE WHEN
CASE WHEN 语句是实现 SQL 条件逻辑转换的 DECODE() 替代方案。其语法与实现方式在 SQL Server、PostgreSQL 和 MySQL 数据库中较为一致。
下面的示例展示了如何在 SELECT 语句中使用 CASE WHEN 转换数据。该查询还展示了如何将 CASE WHEN 与其他 SQL 函数结合,实现复杂的条件转换。
-- Select department ID
SELECT
department_id,
-- Use CASE to transform department_id into department_name
CASE
WHEN department_id = 1 THEN 'IT'
WHEN department_id = 2 THEN 'HR'
WHEN department_id = 3 THEN 'Finance'
WHEN department_id = 4 THEN 'Marketing'
WHEN department_id = 5 THEN 'Sales'
ELSE 'Unknown'
END AS department_name,
SUM(salary) AS total_salary,
-- Calculate the average salary for each department and round to the nearest whole number
ROUND(AVG(salary), 0) AS average_salary,
-- Use CASE to categorize average salary into 'High Paying' or 'Low Paying'
CASE
WHEN AVG(salary) > 65000 THEN 'High Paying'
ELSE 'Low Paying'
END AS salary_category
FROM
employees
GROUP BY
department_id; -- Group results by department ID
结语与进阶学习
在学习如何高效进行数据转换时,理解 Oracle 的 DECODE() 函数非常重要。DECODE() 为在数据转换中应用条件逻辑提供了多种用例。同时,学习在 SQL Server、PostgreSQL 和 MySQL 中的替代性条件转换方法也很关键。建议您在不同数据集和用例中练习 DECODE(),以提升数据转换能力。
如果您希望提升数据分析技能,推荐学习 DataCamp 的 Reporting in SQL 课程,增强分析与展示能力。同样,您也可以查看我们的 Associate Data Analyst in SQL 职业路径,帮助您持续巩固作为数据分析师所需的 SQL 能力。最后,强烈推荐 DataCamp 的 Data-Driven Decision Making in SQL 项目,用不同 SQL 技术进行分析与报告,充分展示您的掌握程度,从而在众多数据分析师中脱颖而出。
数据科学技术写作者,具备数据分析、商业智能和数据科学的一线实践经验。我撰写以行业为导向的实用内容,涵盖 SQL、Python、Power BI、Databricks 和数据工程,并以真实的分析工作为基础。我的写作兼顾技术深度与业务影响,帮助专业人士将数据转化为自信的决策。
常见问题解答
什么是 SQL DECODE() 函数?
SQL 的 DECODE() 是用于在数据转换中执行条件逻辑的函数。
哪些数据库支持 SQL DECODE() 函数?
只有 Oracle 数据库原生支持 SQL DECODE() 函数。SQL Server、PostgreSQL 和 MySQL 则通过 CASE WHEN 语句实现条件转换。
我可以将 DECODE() 与其他 SQL 函数一起使用吗?
Oracle 的 DECODE() 函数可与其他 SQL 函数(如 AVG()、SUM() 和 COUNT())配合使用,以执行高级条件转换。
可以使用嵌套的 DECODE() 语句吗?
Oracle 数据库支持嵌套的 DECODE() 语句以实现复杂逻辑。但是,过长的嵌套 DECODE() 语句可能难以维护和阅读。
DECODE() 函数能处理 NULL 值吗?
DECODE() 函数会将 NULL 作为默认情况处理,如果在数据转换中条件不满足,将返回 NULL 值。
除了 DECODE(),Oracle 还有哪些特有函数?
Oracle 数据库特有的其他函数包括 NVL(),用于将 NULL 替换为指定值。
