PostgreSQL 教程: PL/pgSQL case 语句

八月 21, 2023

摘要:在本教程中,您将了解如何使用 PL/pgSQL 的case语句,根据特定条件执行语句。

除了if 语句之外,PostgreSQL 还提供了允许您根据条件执行代码块的case语句。

case语句根据条件从when部分列表中选择要执行的when部分。

case语句有两种形式:

  • 简单的case语句
  • 检索式case语句

请注意,您不应混淆case语句和 case 表达式case表达式的计算结果为一个值,而case语句根据条件选择一个部分来执行。

1) 简单的 case 语句

让我们从简单case语句的语法开始:

case search-expression
   when expression_1 [, expression_2, ...] then
      when-statements
  [ ... ]
  [else
      else-statements ]
END case;

search-expression是一个可计算结果的表达式。

case语句使用等于运算符 (=) 从上到下将search-expression的结果与每个when分支中的expression进行比较。

如果该case语句找到匹配项,它将执行相应的when部分。此外,它还会停止将search-expression的结果与其余表达式进行比较。

如果该case语句找不到任何匹配项,它将执行else部分。

else部分是可选的。如果search-expression的结果与各when部分中的expression不匹配,并且else部分不存在,则case语句将引发case_not_found异常。

以下是简单case语句的示例。

do $$
declare
	rate   film.rental_rate%type;
	price_segment varchar(50);
begin
    -- get the rental rate
    select rental_rate into rate
    from film
    where film_id = 100;

	-- assign the price segment
	if found then
		case rate
		   when 0.99 then
              price_segment =  'Mass';
		   when 2.99 then
              price_segment = 'Mainstream';
		   when 4.99 then
              price_segment = 'High End';
		   else
	    	  price_segment = 'Unspecified';
		end case;
		raise notice '%', price_segment;
    end if;
end; $$

输出:

NOTICE:  High End

此示例首先查询 id 为 100 的电影。根据租赁费率,它为电影分配一个价格段,可以是大众、主流或高端。如果价格不是 0.99、2.99 或 4.99,则case语句将电影指定为未指定的价格段。

下面的流程图说明了本例中的简单case语句:

PL/pgSQL simple case statement

2) 检索式 case 语句

以下语法显示了检索式case语句的语法:

case
    when boolean-expression-1 then
      statements
  [ when boolean-expression-2 then
      statements
    ... ]
  [ else
      statements ]
end case;

在此语法中,case语句从上到下顺序计算布尔表达式,直到找到计算结果为true的表达式。

一旦找到计算结果为true的表达式,case语句就会执行相应的when部分,并立即停止搜索剩余的表达式。

如果没有表达式计算结果为true,则该case语句将执行else部分。

else部分是可选的。如果省略else部分并且没有表达式求值为true,则该case语句将引发case_not_found异常。

以下示例说明了如何使用简单的case语句:

do $$ 
declare
    total_payment numeric; 
    service_level varchar(25) ;
begin
     select sum(amount) into total_payment
     from Payment
     where customer_id = 100; 
	 
	 if found then
	    case 
		   when total_payment > 200 then
               service_level = 'Platinum' ;
           when total_payment > 100 then
	           service_level = 'Gold' ;
           else
               service_level = 'Silver' ;
        end case;
		raise notice 'Service Level: %', service_level;
     else
	    raise notice 'Customer not found';
	 end if;
end; $$

怎么运行的:

  • 首先,从payment表中查询 ID 为 100 的客户支付的总付款。
  • 然后,根据总付款额为客户分配服务级别。

下图说明了运行的逻辑:

PL/pgSQL searched case statement

请注意,检索式case语句与 if then elsif 语句类似。

在本教程中,您学习了如何使用 PL/pgSQL 的case语句,根据特定条件执行语句。