2014-10-07 102 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