PostgreSQL – CASE 语句
PostgreSQL为您提供了CASE语句,允许您有条件地执行代码块。 CASE语句有两种形式:
- 简单的 CASE 语句
- 搜索 CASE 语句
简单的 CASE 语句
Syntax:
CASE search-expression
WHEN expression_1 [, expression_2, ...] THEN
when-statements
[ ... ]
[ELSE
else-statements ]
END CASE;
搜索表达式是一个表达式,它将使用相等操作数 (=) 对每个 WHEN 分支中的表达式进行计算。如果找到匹配项,则执行相应 WHEN 分支中的 when 语句。下面的后续表达式将不会被评估。
如果未找到匹配项,则执行 ELSE 分支中的 else 语句。 ELSE 分支是可选的。如果找不到匹配项并且没有 ELSE 分支,PostgreSQL 将引发CASE_NOT_FOUND异常。
让我们看看示例 dvdrental 数据库中的一些示例。
例子:
在这里,我们将创建一个名为get_price_segment的新函数,它接受 p_film_id 作为论据。根据电影的租借率,返回价格段:大众、主流、高端。如果价格不是 0.99、2.99 或 4.99,函数返回未指定。
CREATE OR REPLACE FUNCTION get_price_segment(p_film_id integer)
RETURNS VARCHAR(50) AS $$
DECLARE
rate NUMERIC;
price_segment VARCHAR(50);
BEGIN
-- get the rate based on film_id
SELECT INTO rate rental_rate
FROM film
WHERE film_id = p_film_id;
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;
RETURN price_segment;
END; $$
LANGUAGE plpgsql;
现在使用以下语句测试get_price_segment()函数:
SELECT get_price_segment(123) AS "Price Segment";
输出:
搜索 CASE 语句
Syntax:
CASE
WHEN boolean-expression-1 THEN
statements
[ WHEN boolean-expression-2 THEN
statements
... ]
[ ELSE
statements ]
END CASE;
搜索到的 CASE 语句根据每个 WHEN 子句中的布尔表达式的结果执行语句。 PostgreSQL 从上到下依次计算布尔表达式,直到一个表达式为真。然后评估停止并执行相应的语句。控制被传递到 END CASE 之后的下一条语句。
如果没有找到真正的结果,则执行 ELSE 子句中的语句。 ELSE 子句是可选的。如果省略 ELSE 子句并且没有真正的结果,PostgreSQL 将引发CASE_NOT_FOUND异常。
例子:
这 get_customer_service函数接受p_customer_id作为参数。它首先从付款表中获取客户支付的总付款。然后根据总支付,该函数使用搜索到的CASE语句返回服务级别白金、黄金和白银。
CREATE OR REPLACE FUNCTION get_customer_service (p_customer_id INTEGER)
RETURNS VARCHAR (25) AS $$
DECLARE
total_payment NUMERIC ;
service_level VARCHAR (25) ;
BEGIN
-- get the rate based on film_id
SELECT
INTO total_payment SUM (amount)
FROM
payment
WHERE
customer_id = p_customer_id ;
CASE
WHEN total_payment > 200 THEN
service_level = 'Platinum' ;
WHEN total_payment > 100 THEN
service_level = 'Gold' ;
ELSE
service_level = 'Silver' ;
END CASE ;
RETURN service_level ;
END ; $$ LANGUAGE plpgsql;
现在让我们使用以下语句测试上述函数:
SELECT
148 AS customer,
get_customer_service (148)
UNION
SELECT
178 AS customer,
get_customer_service (178)
UNION
SELECT
81 AS customer,
get_customer_service (81);
输出: