📜  PostgreSQL – CASE 语句

📅  最后修改于: 2022-05-13 01:57:15.898000             🧑  作者: Mango

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);

输出: