PostgreSQL CASE 在函数中的使用

发布于 2024-12-27 17:25:59 字数 457 浏览 3 评论 0原文

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

例如:

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 ...

Can't we use CASE condition outside SQL SELECT statements?

E.g.:

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

I get the following error:

ERROR:  syntax error at or near "_summary"
LINE 86: _summary = _summary || '<li>Apply To: ' || _applies ...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笑脸一如从前 2025-01-03 17:25:59

这涉及条件控制结构过程语言的 CASE PL/pgSQL,用于 PL/pgSQL 函数过程 ,或 DO 语句
不要与 CASE 混淆SQL 表达式。不同的语言!语法规则略有不同。

虽然 SQL CASE 可以嵌入到 PL/pgSQL 代码内的 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;

您必须使用 PL/pgSQL 语句,以分号 (;) 终止并使用 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;

This concerns the conditional control structure CASE of the procedural language PL/pgSQL, to be used in PL/pgSQL functions, procedures, or DO statements.
Not to be confused with the CASE expression of SQL. Different language! Subtly different syntax rules.

While SQL CASE can be embedded in SQL expressions inside PL/pgSQL code, you cannot have stand-alone SQL CASE expressions (would be nonsense).

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

You must use PL/pgSQL statements, terminated with a semicolon (;) and END CASE; to close it.

Is ELSE required?

PL/pgSQL CASE expects an ELSE branch and raises an error if it's missing when reached. The manual:

If no match is found, the ELSE statements are executed;
but if ELSE is not present, then a CASE_NOT_FOUND exception is raised.

You can use an empty ELSE:

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

This is different for SQL CASE where ELSE is optional. If the ELSE keyword is present an expression must be given. Without ELSE, it defaults to NULL. Like:

CASE WHEN old.applies_to = 'admin' THEN 'My Self'
  -- ELSE null  -- optional
END;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文