CodeGym /课程 /SQL SELF /控制结构入门:IF、CASE、RETURN

控制结构入门:IF、CASE、RETURN

SQL SELF
第 51 级 , 课程 0
可用

控制结构是任何程序的基础,不管是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); -- 负数

常见错误和容易踩的坑

  1. 漏写END语句:忘了写END CASE;或者END IF;,PostgreSQL会立刻提醒你要把代码块结束掉。
  2. ELSIF时的逻辑错误:条件的顺序很重要!更宽泛的条件(比如temp > 0)不能放在更具体的条件(比如temp > 20)前面。
  3. 忘了RETURN在PL/pgSQL里,如果你声明了RETURNS,函数就必须返回点东西。

就这些啦。我们已经讲完了PL/pgSQL里控制结构和逻辑的基础。这些知识以后写更复杂的函数时肯定用得上!下次我们会讲循环和它们的用法。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION