PostgreSQL CASE 语句语法问题

PostgreSQL CASE statement syntax issues

提问人:Kyle 提问时间:11/24/2022 最后编辑:Kyle 更新时间:11/24/2022 访问量:45

问:

我收到以下语法错误:

CREATE OR REPLACE FUNCTION my_function(old_num INTEGER)
   returns INTEGER
   language plpgsql
AS
$$
DECLARE new_num INTEGER;
BEGIN
   CASE
      WHEN (old_num IN (1, 2, 3, 4)) THEN new_num = 10
      WHEN (old_num IN (5, 6, 7, 8)) THEN new_num = 20
      ELSE new_num = 0
   END;

   RETURN new_num;
END;
$$;

该错误指向第二个 WHEN。我试过使用各种括号的组合。这个语法有什么问题??

PostgreSQL 语法错误 案例 plpgsql

评论


答:

0赞 Thorsten Kettner 11/24/2022 #1

表达式生成一个值。您希望它产生 10、20 或 0,然后将其分配给变量 new_num。CASE

new_num :=
 CASE
    WHEN (old_num IN (1, 2, 3, 4)) THEN 10
    WHEN (old_num IN (5, 6, 7, 8)) THEN 20
    ELSE 0
 END;
0赞 Stanislav Kovalenko 11/24/2022 #2
CREATE OR REPLACE FUNCTION my_function(old_num INTEGER)
   returns INTEGER
   language plpgsql
AS
$$
DECLARE new_num INTEGER;
BEGIN
   new_num := (CASE 
      WHEN old_num in (1, 2, 3, 4) THEN 10
      WHEN old_num in (5, 6, 7, 8) THEN 20
      ELSE 0
   END);

   RETURN new_num;
END;
$$;
0赞 Adrian Klaver 11/24/2022 #3

备选解决方案:

CREATE OR REPLACE FUNCTION public.my_function(old_num integer)
 RETURNS integer
 LANGUAGE plpgsql
AS $function$
DECLARE new_num INTEGER;
BEGIN
   SELECT INTO new_num
   CASE
      WHEN (old_num IN (1, 2, 3, 4)) THEN 10
      WHEN (old_num IN (5, 6, 7, 8)) THEN 20
      ELSE 0
   END;

   RETURN new_num;
END;
$function$

select my_function(1);
 my_function 
-------------
          10

select my_function(6);
 my_function 
-------------
          20

select my_function(12);
 my_function 
-------------
           0


0赞 Belayer 11/24/2022 #4

您可以将函数转换为 SQL 函数,并将其简化为单个 Select 语句。请参阅演示

create or replace function public.my_function(old_num integer)
 returns integer
 language sql
as $$
   select  case when (old_num in (1, 2, 3, 4)) then 10
                when (old_num in (5, 6, 7, 8)) then 20
                else 0
           end;
$$;