八月 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
语句,根据特定条件执行语句。