2013-04-03 47 views
2

我想在postgres中創建一個函數,如果它不存在並插入一行,並返回該行的id(新創建或現有)。我可以在postgres中使用INSERT內CASE

我想出了這一點:

CREATE OR REPLACE FUNCTION              
get_enttype(name character varying, module character varying)    
RETURNS integer LANGUAGE SQL STABLE AS $$         
    SELECT typeid FROM enttypes WHERE name = $1 AND module = $2    
$$;                    

CREATE OR REPLACE FUNCTION              
    ensure_enttype(name character varying, module character varying)    
    RETURNS integer LANGUAGE SQL AS $$           
    SELECT CASE WHEN get_enttype($1, $2) IS NULL         
    THEN                   
     INSERT INTO enttypes(name, module) VALUES ($1, $2) RETURNING typeid             
    ELSE                   
     get_enttype($1, $2)              
    END                   
$$;      

然而它引起了由於INSERTCASE語法錯誤。我設法通過在INSERT中創建一個單獨的函數並在CASE中使用此函數來解決此問題。它按預期工作,但這種修復看起來有點奇怪。我的問題是 - 我可以解決這個問題而不創建另一個功能?

回答

2

不,您不能在CASEsql函數中使用INSERT。但是,您可以:

  • 使用PL/PgSQL函數和IF ... ELSE ... END語句;或
  • 使用一個可寫的公共表表達式(wCTE)或INSERT INTO ... SELECT查詢
1

純SQL可以做到這一點:

create or replace function ensure_enttype(
    name character varying, module character varying 
) returns integer language sql as $$ 

    insert into enttypes(name, module) 
    select $1, $2 
    where get_enttype($1, $2) is null 
    ; 
    select get_enttype($1, $2); 
$$; 
+0

但將你的代碼返回的typeid如果記錄已經存在? – zefciu

+0

@zefciu編輯後的查詢將會執行。 –

相關問題