2014-10-07 79 views
0

我试图运行此查询: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服务器的代码。现在我的疑问是: 你知道OUTPUT语句的等价物吗?

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

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

的我需要什么,以使其工作做什么建议吗?

在此先感谢您的支持时间&!

+0

没有'OUTPUT Deleted.tipo AS Postgres里BeforeValue'选项。你在寻找“回归”条款吗? http://www.postgresql.org/docs/current/static/sql-update.html你也没有声明'Beforevalue'和'AfterValue'变量。反正你也没有使用它们。你究竟想达到什么目的?据我所知,你可以简单地使用:'UPDATE backup_factura SET tipo = CASE WHEN total_fact <= 100 THEN'X'WHEN total_fact <= 200 THEN'Y'ELSE'Z'END CASE;'不需要循环不需要'where'子句。这会更快**。 – 2014-10-07 20:07:30

+0

错误实际上并不存在(根据PostgreSQL在其他部分)。检查我的编辑 – 2014-10-07 20:11:46

+0

这并不重要,Postgres中没有'output'子句。检查手册(你也用''结束'update'语句,那么你有(无效的)'output'子句和'where'子句是没有意义的。 – 2014-10-07 20:12:17

回答

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完全模仿你的循环 - 但是我猜测你在这一列中没有负值。

请注意,SQLcase声明只需要end。没有end caseSQLhttp://www.postgresql.org/docs/9.3/static/functions-conditional.html

与SQL Server不同,Postgres的(和许多其他DBMS),使SQL(查询语言)和程序代码(在你的情况PL/pgSQL的)之间有明显的区别。你不能混用这两种语言(SQL Server只有一种语言:T-SQL)。

case声明PL/pgSQL的确实是使用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

+0

谢谢你的回答。对于输出而言,它是来自SQL Server的语句 OUTPUT子句用于显示变量值之前和之后的值 – 2014-10-07 20:23:52

+0

您应该使用Postgres手册而不是SQL Server手册 – 2014-10-07 20:24:29

+0

哈哈我知道我编辑过我的帖子。我试图从SQL Server更改为PostgreSQL DBMS – 2014-10-07 20:26:04