PostgreSQL CASE 在函数中的使用

问题描述 投票:0回答:1

我们不能在 SQL

CASE
语句之外使用
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>';

我收到以下错误:

ERROR:  syntax error at or near "_summary"
LINE 86: _summary = _summary || '<li>Apply To: ' || _applies ...
postgresql conditional-statements case plpgsql
1个回答
44
投票

这涉及过程语言PL/pgSQL

条件控制结构CASE,用于plpgsql函数过程
DO
语句

不要与 SQL
CASE
表达式相混淆。不同的语言!语法规则略有不同。

虽然 SQL

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

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

您必须使用完全限定的语句,以分号 (

;
) 结尾,并用
END CASE
来关闭它。

需要
ELSE
吗?

PL/pgSQL

CASE
需要一个
ELSE
分支,如果到达时缺失,则会引发错误。 说明书:

如果没有找到匹配,则执行

ELSE
语句; 但如果
ELSE
不存在,则会引发
CASE_NOT_FOUND
异常。

您可以使用空的

ELSE
:

CASE 
   WHEN old.applies_to = 'admin' THEN
      _applies_to := 'My Self';
   ELSE
      --  do nothing
END CASE;

这对于 SQL

CASE
来说是不同的,其中
ELSE
是可选的。如果存在
ELSE
关键字,则必须给出表达式。如果没有
ELSE
,则默认为
NULL
。喜欢:

CASE WHEN old.applies_to = 'admin' THEN 'My Self'
  -- ELSE null  -- optional
END;
© www.soinside.com 2019 - 2024. All rights reserved.