我可以在postgres中使用CASE内的INSERT吗?

时间:2013-04-03 07:29:58

标签: postgresql case sql-insert

我正在尝试在postgres中创建一个函数,如果它不存在则插入一行并返回行的id(新创建或现有)。

我想出了这个:

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 个答案:

答案 0 :(得分:2)

不,您无法在INSERT函数中使用CASE内的sql。但是你可以:

  • 使用带有IF ... ELSE ... END语句的PL / PgSQL函数;或
  • 使用可写公用表表达式(wCTE)或INSERT INTO ... SELECT查询

答案 1 :(得分:1)

Pure 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);
$$;