在 PostgreSQL 中,可以使用 CASE
语句结合窗口函数(如 ROW_NUMBER()
)来有条件地为每行生成值。以下是一个基础概念的解释以及相关的示例代码。
假设我们有一个名为 employees
的表,结构如下:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
salary NUMERIC
);
我们希望为每个员工根据其部门和工作年限生成一个奖金(bonus),规则如下:
可以使用以下 SQL 查询来实现:
SELECT
id,
name,
department,
salary,
CASE
WHEN department = 'Sales' AND salary > 5000 THEN salary * 0.10
WHEN department = 'IT' AND salary > 6000 THEN salary * 0.15
ELSE 0
END AS bonus
FROM employees;
这种技术在需要对数据进行条件性处理的场景中非常有用,例如:
CASE
语句使得逻辑易于理解和维护。问题:当条件变得复杂时,CASE
语句可能会变得难以管理。
解决方法:
CASE
语句。例如,如果奖金计算规则变得更加复杂,可以创建一个函数来处理这些逻辑:
CREATE OR REPLACE FUNCTION calculate_bonus(dept VARCHAR, sal NUMERIC) RETURNS NUMERIC AS $$
BEGIN
IF dept = 'Sales' AND sal > 5000 THEN
RETURN sal * 0.10;
ELSIF dept = 'IT' AND sal > 6000 THEN
RETURN sal * 0.15;
ELSE
RETURN 0;
END IF;
END;
$$ LANGUAGE plpgsql;
然后在查询中调用这个函数:
SELECT
id,
name,
department,
salary,
calculate_bonus(department, salary) AS bonus
FROM employees;
这样可以使主查询保持简洁,同时将复杂的逻辑封装在函数中,便于管理和重用。
领取专属 10元无门槛券
手把手带您无忧上云