PostgreSQL 教程: PL/pgSQL if 条件语句

八月 21, 2023

摘要:在本教程中,您将学习如何使用 PL/pgSQL 的if语句根据特定条件执行命令。

if语句根据布尔表达式的结果确定要执行哪些语句。

PL/pgSQL 为您提供了三种形式的if语句。

  • if then
  • if then else
  • if then elsif

1) PL/pgSQL if-then 语句

下面说明了if语句的最简单形式:

if condition then
   statements;
end if;

如果condition为 true,则if语句会执行statements中的语句。如果condition的计算结果为false,则控制权将传递到END if部分之后的下一条语句。

condition是一个布尔表达式,计算结果为 true 或 false。

statements可以是一个或多个语句,如果condition为 true,它们将会被执行。它可以是任何有效的语句,甚至是另一个if语句。

当一个if语句放置在另一个if语句内时,称为嵌套 if 语句。

下面的流程图说明了这个简单的if语句。

PL/pgSQL if statement

请参见以下示例:

do $$
declare
  selected_film film%rowtype;
  input_film_id film.film_id%type := 0;
begin
  select * from film
    into selected_film
    where film_id = input_film_id;

  if not found then
    raise notice 'The film % could not be found',
                 input_film_id;
  end if;
end $$;

在此示例中,我们通过一个特定的电影 ID (0) 选择了一部电影。

found是 PL/pgSQL 过程语言中可用的全局变量。如果select into语句分配了行,则设置found变量为true,如果未返回行,则设置变量为false

我们使用if语句来检查指定 id (0) 的电影是否存在,如果不存在则发出通知。

ERROR:  The film 0 could not be found

如果将input_film_id变量的值更改为电影表中存在的某个值(例如 100),您将看不到任何消息。

2) PL/pgSQL if-then-else 语句

下面说明了if-then-else语句的语法:

if condition then
  statements;
else
  alternative-statements;
end if;

如果condition的计算结果为 true,则if then else语句执行if分支中的语句;否则,执行else分支中的语句。

以下流程图说明了if else语句。

PL/pgSQL if else statement

请参见以下示例:

do $$
declare
  selected_film film%rowtype;
  input_film_id film.film_id%type := 100;
begin
  select * from film
    into selected_film
    where film_id = input_film_id;

  if not found then
    raise notice 'The film % could not be found',
                 input_film_id;
  else
    raise notice 'The film title is %', selected_film.title;
  end if;
end $$;

在此示例中,film 表中存在 ID 为 100 的电影,因此FOUND变量设置为 true。因此,else分支中的语句会被执行。

这是输出:

NOTICE:  The film title is Brooklyn Desert

3) PL/pgSQL if-then-elsif 语句

下面说明了if then elsif语句的语法:

if condition_1 then
  statement_1;
elsif condition_2 then
  statement_2
...
elsif condition_n then
  statement_n;
else
  else-statement;
end if;

if语句和if then else语句只计算一个条件。但是,if then elsif语句会计算多个条件。

如果一个condition为真,则执行该分支中的相应语句。

例如,如果condition_1true,则if then elsif执行statement_1,并停止计算其他条件。

如果所有条件的计算结果均为false,则if then elsif执行else分支中的语句。

下面的流程图说明了if then elsif语句:

PL/pgSQL if ELSif else Statement

让我们看下面的例子:

do $$
declare
   v_film film%rowtype;
   len_description varchar(100);
begin
  select * from film
    into v_film
    where film_id = 100;

  if not found then
    raise notice 'Film not found';
  else
    if v_film.length > 0 and v_film.length <= 50 then
      len_description := 'Short';
    elsif v_film.length > 50 and v_film.length < 120 then
      len_description := 'Medium';
    elsif v_film.length > 120 then
      len_description := 'Long';
    else 
      len_description := 'N/A';
    end if;

    raise notice 'The % film is %.',
                 v_film.title, len_description;
  end if;
end $$;

怎么运行的:

  • 首先查询 id 为 100 的电影,如果该电影不存在,则发出找不到该电影的通知。
  • 其次,使用if then elsif语句,根据电影的长度为电影分配描述。

概括

  • 当条件为true时,使用if then来执行语句。

  • 使用if then else,可以在条件为true时执行语句,在条件为false时执行其他语句。

  • 使用if then elsif来计算多个条件,并在相应的条件为true时执行语句。