八月 21, 2023
摘要:在本教程中,您将了解如何使用 PL/pgSQL 的case语句,根据特定条件执行语句。
目录
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语句:

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 的客户支付的总付款。 - 然后,根据总付款额为客户分配服务级别。
下图说明了运行的逻辑:

请注意,检索式case语句与 if then elsif 语句类似。
在本教程中,您学习了如何使用 PL/pgSQL 的case语句,根据特定条件执行语句。