如何在 PostgreSQL、PL/pgSQL 上执行匿名代码块切换 CASE 语句?

Posted

技术标签:

【中文标题】如何在 PostgreSQL、PL/pgSQL 上执行匿名代码块切换 CASE 语句?【英文标题】:How to perform an anonymous code block switch CASE statement on the PostgreSQL, PL/pgSQL? 【发布时间】:2016-11-28 21:25:27 【问题描述】:

如何在PostgreSQL、PL/pgSQL上执行switch CASE语句?

目前我们可以像这样对一个 IF 块:

IF boolean THEN
    statements;
ELSE 
IF boolean THEN
    statements;
ELSE 
   statements;
END IF;
END IF;

但是,在某些情况下并不需要它。那么更好的方法是使用与通常的 switch 语句接近的东西。

相关话题:

    PostgreSQL IF statement

【问题讨论】:

请注意,您可以在示例中使用 ELSIF 语句而不是两个单独的 IF/ELSE/END IF 语句。 【参考方案1】:

为了模仿 switch 语句,将 switch 值直接放在“CASE”之后的“WHEN”之前。每个 when 语句都会检查它的值是否等于 CASE 值。

使用专用 case 语句返回颜色词的十六进制颜色值的示例:

DO $$ 
DECLARE
  test_color varchar;
  hex_color varchar;
BEGIN
  test_color := 'blue';
  hex_color :=
    CASE test_color
      WHEN 'red' THEN
        '#FF0000'
      WHEN 'blue' THEN
        '#0000FF'
      WHEN 'yellow' THEN
        '#FFFF00'
      ELSE --we do not use that color, replace with white
        '#FFFFFF'
    END;
END $$

我无法在我的计算机上测试匿名块,所以这是我测试过的可以在匿名块中使用的直接 SQL 语句:

SELECT
    CASE 'blue'
      WHEN 'red' THEN
        '#FF0000'
      WHEN 'blue' THEN
        '#0000FF'
      WHEN 'yellow' THEN
        '#FFFF00'
      ELSE --we do not use that color, replace with white
        '#FFFFFF'
    END;

【讨论】:

【参考方案2】:

带有anonymous code block 过程块的PL/pgSQL CASE 的基本/基本结构是:

DO $$ BEGIN
    CASE
        WHEN boolean-expression THEN
          statements;
        WHEN boolean-expression THEN
          statements;
        ...
        ELSE
          statements;
    END CASE;
END $$;

参考文献:

    http://www.postgresql.org/docs/current/static/sql-do.html https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html

【讨论】:

以上是关于如何在 PostgreSQL、PL/pgSQL 上执行匿名代码块切换 CASE 语句?的主要内容,如果未能解决你的问题,请参考以下文章

将数组传递给 PostgreSQL PL/pgSQL 函数

PostgreSQL 提高 PL/pgSQL 函数的性能

PostgreSQL PL/pgSQL:存储在表中的查询(营业时间)

PostgreSQL-PL/pgSQL控制结构

使用 PL/pgSQL 在 PostgreSQL 中将多个字段作为记录返回

PostgreSQL vs Oracle:PL/pgSQL 的“编译时”检查