PostgreSQL CASE函数

时间:2014-10-07 20:01:03

标签: function postgresql case

我试图运行此查询:

CREATE Function sp_test_case () returns void as $$ 
DECLARE
    cont int=(Select MAX(id_fact)from backup_factura);
BEGIN

  while cont>0
  LOOP

    UPDATE backup_factura
    SET tipo= CASE 
            WHEN ((total_fact) <=100) THEN 'X'
            WHEN ((total_fact) <=200) THEN 'Y'
            ELSE 'Z'
           END;

    OUTPUT Deleted.tipo AS BeforeValue,
           Inserted.tipo AS AfterValue
    WHERE id_fact=cont;

    cont:=cont-1;

   END LOOP;

RETURN;   
END;   
$$ LANGUAGE plpgsql; 

我调整了最初在SQL server中编写的代码。现在我怀疑是: 你知道OUTPUT语句的等价物吗?

OUTPUT子句用于显示假期前后值。 F.E:

OUTPUT Deleted.BusinessEntityID, Deleted.VacationHours AS BeforeValue, 
       Inserted.VacationHours AS AfterValue

有什么建议我需要做些什么才能让它发挥作用?

提前感谢您的时间和支持!

1 个答案:

答案 0 :(得分:2)

你可以在没有函数或循环的情况下完成所有这些:

这将完成同样的事情:

UPDATE backup_factura 
    SET tipo = CASE 
                 WHEN total_fact <=100 THEN 'X'
                 WHEN total_fact <=200 THEN 'Y'
                 ELSE 'Z'
               END;

严格来说,你需要一个where id_fact >= 0来完全模仿你的循环 - 但我猜你在那一栏中没有负值。

请注意, SQL case语句只需要end SQL 中没有end casehttp://www.postgresql.org/docs/9.3/static/functions-conditional.html

与SQL Server不同,Postgres(和许多其他DBMS)明确区分SQL(查询语言)和过程代码(在您的情况下为PL / pgSQL)。您不能混合使用这两种语言(SQL Server只有一种语言:T-SQL)。

PL / pgSQL中的case语句确实是使用end case终止的:http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html#AEN58362

不确定output deleted应该做什么,因为你没有删除任何内容。

要从更新语句返回新值,请使用returning子句:http://www.postgresql.org/docs/current/static/sql-update.html