函数中的PostgreSQL CASE用法

Yoh*_*oda 15 postgresql conditional case plpgsql

我们不能CASE在SQL SELECT语句之外使用条件吗?

例如:

CASE 
  WHEN old.applies_to = 'admin' THEN _applies_to = 'My Self'
  ELSE _applies_to = initcap(old.applies_to)
END
 _summary = _summary || '<li>Apply To: ' || _applies_to || '</li>';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR:  syntax error at or near "_summary"
LINE 86: _summary = _summary || '<li>Apply To: ' || _applies ...
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 18

这涉及在plpgsql函数语句中使用的过程语言PL/pgSQL条件控制结构CASE.不要与SQL表达混淆.不同的语言!而且语法规则也略有不同.DOCASE

虽然SQL CASE可以嵌入到PL/pgSQL代码中的SQL表达式中(这主要只是SQL命令的粘合剂),但是你不能拥有独立的SQL CASE表达式(这是无意义的).

-- inside plpgsql code block:
CASE 
   WHEN old.applies_to = 'admin' THEN
      _applies_to := 'My Self';
   ELSE
      _applies_to := initcap(old.applies_to);
END CASE;
Run Code Online (Sandbox Code Playgroud)

您必须使用以semicolon(;)结尾的完全限定语句并将END CASE其关闭.

在评论中回答其他问题

根据文档,语句的ELSE关键字不是可选的.我引用上面的链接:CASE

如果未找到匹配项,ELSE则执行语句; 但如果ELSE不存在,则CASE_NOT_FOUND引发异常.

但是,您可以使用空ELSE:

CASE 
   WHEN old.applies_to = 'admin' THEN
      _applies_to := 'My Self';
   ELSE
      --  do nothing
END CASE;
Run Code Online (Sandbox Code Playgroud)

这与SQL CASE表达式不同,后者ELSE是可选的,但如果关键字存在,则还必须给出表达式!

  • @Yohan:跳过ELSE子句是不明智的.始终包括它.使用信息性消息提出异常.如果不应该出现在ELSE子句中. (2认同)