【问题标题】:PostgreSQL CASE usage in functionsPostgreSQL CASE 在函数中的使用
【发布时间】:2012-02-13 23:49:46
【问题描述】:

我们不能在 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 ...

【问题讨论】:

    标签: postgresql conditional case plpgsql


    【解决方案1】:

    这涉及procedural language PL/pgSQLconditional control structure CASE,用于plpgsql functionsDO statements
    不要与CASE expression of SQL 混淆。不一样的语言!还有微妙不同的语法规则。

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

    您必须使用以分号 (;) 和 END CASE 结尾的完全限定语句来关闭它。

    回复additional question in comment

    根据文档,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 是可选的,但如果存在关键字,则也必须给出表达式!

    【讨论】:

    • 非常感谢您对欧文的快速支持。非常感谢。
    • 另一个小问题欧文。根据 CASE 语句的文档 ELSE 条件是可选的。但是当我尝试使用没有 ELSE 的语句运行一系列 WHEN 条件时,查询浏览器会给我错误。 ERROR: case not found. HINT: CASE statement is missing ELSE part.如果你需要我会发布相关的脚本部分。
    • @Yohan:请查看其他答案。
    • @Yohan:跳过 ELSE 子句是不明智的。始终包括它。使用信息丰富的消息引发异常。如果它不应该出现在 ELSE 子句中。
    • @Brandstetter:感谢您的建议。我已经按照你的建议改变了逻辑。
    猜你喜欢
    • 2015-09-25
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2018-01-11
    • 2021-08-26
    相关资源
    最近更新 更多