控制结构是任何程序的基础,不管是SQL脚本、Python代码,还是火星上的机器人在纠结要不要发信号回家,还是去陨石坑边上找找有没有生命。
在PL/pgSQL里,控制结构能帮我们:
- 如果条件成立,执行特定操作。
- 控制代码的执行顺序。
- 实现决策逻辑。
你可以把它们想象成马路上的交通标志:“如果看到STOP,就停下。如果是绿灯——就走!”
PL/pgSQL里最常用的控制结构有:
IF– 检查条件并执行相应的命令。CASE– 当条件很多时,是IF的替代方案。RETURN– 结束函数执行并返回结果。
你应该已经对它们有点印象了。学过编程语言之后,这些东西其实很简单。
条件语句 IF
IF语句用来在某个条件TRUE(为真)时才执行代码。它的基本结构如下:
IF 条件 THEN
-- 如果条件为真,执行这段代码。
ELSE
-- 如果条件为假,执行这段代码。
END IF;
来写个函数,接收一个数字,返回它是偶数还是奇数:
CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num % 2 = 0 THEN
RETURN '数字是偶数';
ELSE
RETURN '数字是奇数';
END IF;
END;
$$ LANGUAGE plpgsql;
现在来测试一下:
SELECT check_even_odd(4); -- 数字是偶数
SELECT check_even_odd(7); -- 数字是奇数
简单解释一下:IF num % 2 = 0 THEN就是判断数字能不能被2整除。
ELSIF条件
有时候只检查一次不够,你得判断多个条件。这时候就用ELSIF。
假设我们有个函数,返回关于温度的文字描述:
CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
IF temp < 0 THEN
RETURN '超级冷!';
ELSIF temp >= 0 AND temp <= 20 THEN
RETURN '有点凉';
ELSE
RETURN '很暖和!';
END IF;
END;
$$ LANGUAGE plpgsql;
测试一下:
SELECT temperature_comment(-5); -- 超级冷!
SELECT temperature_comment(15); -- 有点凉
SELECT temperature_comment(25); -- 很暖和!
CASE语法
如果你有很多条件,CASE语句就是救星。它有点像IF,但更“优雅”。
CASE
WHEN 条件_1 THEN 值_1
WHEN 条件_2 THEN 值_2
ELSE 默认值
END;
来写个函数,根据分数返回文字评价:
CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
RETURN CASE
WHEN score >= 90 THEN '非常棒'
WHEN score >= 75 THEN '不错'
WHEN score >= 50 THEN '及格'
ELSE '不及格'
END;
END;
$$ LANGUAGE plpgsql;
测试一下:
SELECT grade_comment(95); -- 非常棒
SELECT grade_comment(80); -- 不错
SELECT grade_comment(45); -- 不及格
注意:和IF不一样,CASE会直接返回一个值,所以你可以在CASE里直接用RETURN。
RETURN语句
RETURN会结束函数执行并返回一个值。对于PL/pgSQL里的函数来说,这很关键,因为你声明了RETURNS,就必须返回点啥(比如文本、数字啥的)。
来看个最简单的RETURN例子:
CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
RETURN '你好,世界!';
END;
$$ LANGUAGE plpgsql;
结果:
SELECT return_example(); -- 你好,世界!
但如果有多条分支,比如要检查输入数据,那RETURN就会出现在函数的不同地方:
CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num > 0 THEN
RETURN '正数';
ELSIF num = 0 THEN
RETURN '零';
ELSE
RETURN '负数';
END IF;
END;
$$ LANGUAGE plpgsql;
测试一下:
SELECT check_positive_negative(10); -- 正数
SELECT check_positive_negative(0); -- 零
SELECT check_positive_negative(-5); -- 负数
常见错误和容易踩的坑
- 漏写
END语句:忘了写END CASE;或者END IF;,PostgreSQL会立刻提醒你要把代码块结束掉。 - 用
ELSIF时的逻辑错误:条件的顺序很重要!更宽泛的条件(比如temp > 0)不能放在更具体的条件(比如temp > 20)前面。 - 忘了
RETURN:在PL/pgSQL里,如果你声明了RETURNS,函数就必须返回点东西。
就这些啦。我们已经讲完了PL/pgSQL里控制结构和逻辑的基础。这些知识以后写更复杂的函数时肯定用得上!下次我们会讲循环和它们的用法。
GO TO FULL VERSION