2013-05-20 50 views
1

如果寫這個執行週期WHEN特定條件

DECLARE res INTEGER; 
    DECLARE loop_res INTEGER; 


    BEGIN 
     SELECT 0 INTO loop_res; 



     FOR i IN 1..5 LOOP 
      SELECT loop_res + i INTO loop_res; 
     END LOOP; 


     SELECT 
     case 
      WHEN some_variable < 3 
       THEN --some result 
      WHEN some_variable >= 3 
       THEN loop_res 
     END 
     INTO res; 

這工作,但在這裏,反正會正確執行LOOP語句?

只有在以下情況下才有可能執行LOOP語句,如果WHEN some_variable >= 3

我想:

 SELECT 
     case 
      WHEN some_variable < 3 
       THEN --some result 
      WHEN some_variable >= 3 
       THEN 
        FOR i IN 1..5 LOOP 
         SELECT loop_res + i INTO loop_res; 
        END LOOP; 
        loop_res 
     END 
     INTO res; 

給出錯誤syntax error at or near "FOR" at character ...

回答

4

你試圖混合PL/PGSQL和SQL。他們不是一回事。

SELECT ... CASE WHEN ... ELSE ... END ...,就像你寫的是常規的SQL。它不能嵌入PL/PgSQL語句。

PL/PgSQL CASE沒有出現在正常的SELECT中,只是通過其自身作爲控制結構。它不支持INTO,因爲它不是SELECT。它的形式CASE WHEN ... ELSE ... END CASE;

請參閱PL/PgSQL control structures

你可以寫:

CASE 
    WHEN some_variable < 3 THEN 
     res := 0; 
    WHEN some_variable >= 3 THEN 
     FOR i IN 1..5 LOOP 
      loop_res := loop_res + i; 
     END LOOP; 
     res := loop_res; 
END CASE; 

這是一個PL/pgSQL的CASE。整個方法看起來很奇怪,但你只是顯示虛擬代碼,所以我不能說你真的想做什麼。這很奇怪,你需要LOOP而不是隻使用一些更聰明的SQL,但它確實發生。

在這種情況下,它給我的印象很可能你會變成能夠編寫出使用union S,with查詢(CTE的)查詢,和/或generate_series避免慢PL/PGSQL循環的需要,控制結構。

+0

非常感謝,我不是真的做了什麼,我只是學習和測試如何在concret CASE條件下使用循環語句。 – RIKI

+2

@OTARIKI啊,這樣更有意義。每當你可以避免在PL/PgSQL中使用'LOOP'時,你應該這樣做。與在普通SQL中執行相同的工作相比,它效率非常低。 –

+0

感謝您提供有用的信息 – RIKI