带if语句的Postgresql函数

带if语句的Postgresql函数,postgresql,function,Postgresql,Function,如何使此伪代码在Postgresql中工作: create or replace function getf(arg character varying(255)) returns int as $$ if arg = 'a' then return 1; else return 2; $$ language sql; 基于参数,我需要返回一些值,并且不需要查询其他表。只需要在函数内部构建一个逻辑。 试图用when子句替换if,但不知道如何执行 谢谢 create or replace fun

如何使此伪代码在Postgresql中工作:

create or replace function getf(arg character varying(255)) returns int
as $$
if arg = 'a' then return 1;
else return 2;
$$ language sql;
基于参数,我需要返回一些值,并且不需要查询其他表。只需要在函数内部构建一个逻辑。 试图用when子句替换if,但不知道如何执行

谢谢

create or replace function getf(arg character varying(255)) returns int as $$
begin
  if arg = 'a' then
    return 1;
  else 
    return 2;
  end if;
end; $$ language plpgsql;
请注意,这是一个PL/pgSQL函数

在线手册中有一个非常好的章节介绍了这一点。这将提供开始编写过程函数所需的一切,并为逻辑分支提供足够的支持

请注意,这是一个PL/pgSQL函数

在线手册中有一个非常好的章节介绍了这一点。这将为您提供开始编写过程函数所需的一切,并提供对逻辑分支的充分支持。

使用sql语言,您可以使用:

使用sql语言,您可以使用:


纯SQL函数。这很难看,因为SQL没有IF。您可以改为使用用例,这很难看,因为捕捉空值也需要区分用例

DROP function getf(_arg character varying(255) );
create or replace function getf(_arg character varying(255)) returns INTEGER
as $$
        SELECT 1::integer
        WHERE  _arg = 'a'
        UNION ALL
        SELECT 2::integer
        WHERE  _arg IS DISTINCT FROM 'a'
        ;
$$ language sql;

SELECT getf( 'a' );
SELECT getf( 'b' );
SELECT getf( NULL );

纯SQL函数。这很难看,因为SQL没有IF。您可以改为使用用例,这很难看,因为捕捉空值也需要区分用例

DROP function getf(_arg character varying(255) );
create or replace function getf(_arg character varying(255)) returns INTEGER
as $$
        SELECT 1::integer
        WHERE  _arg = 'a'
        UNION ALL
        SELECT 2::integer
        WHERE  _arg IS DISTINCT FROM 'a'
        ;
$$ language sql;

SELECT getf( 'a' );
SELECT getf( 'b' );
SELECT getf( NULL );
这几乎与Houari的答案相似,但是:

它使用文本作为参数类型——在Postgres中限制参数长度没有意义,在Postgres中,表示形式没有区别; 它是不可变的,因此数据库可以缓存来自同一参数的结果,这会更快; 它是严格的,所以它不会在NULL值上运行,而只是返回NULL,因为它在NULL值上使用可能是一个编程错误,如果它返回2表示NULL,它可能会掩盖此错误并使调试更加困难。 这几乎与Houari的答案相似,但是:

它使用文本作为参数类型——在Postgres中限制参数长度没有意义,在Postgres中,表示形式没有区别; 它是不可变的,因此数据库可以缓存来自同一参数的结果,这会更快; 它是严格的,所以它不会在NULL值上运行,而只是返回NULL,因为它在NULL值上使用可能是一个编程错误,如果它返回2表示NULL,它可能会掩盖此错误并使调试更加困难。
您使用的是sql语言,因此可以找到正确的语句instruction@Patrick奥巴马的回答是好的。但是请注意,大多数情况下,您不需要过程代码。发布真正的问题,您可能会对答案感到惊讶。在这种情况下,我必须创建派生表,如果某些字段具有特定的值,则会根据返回某些状态的传入值创建特定的状态代码纯业务逻辑。该业务逻辑可能可以使用查询中的EXISTS来实现,甚至是一个查找表。函数代价高昂,请参见下面@Tometzky答案中的不可变严格选项+备注。您使用的是sql语言,因此可以找到正确的语句instruction@Patrick奥巴马的回答是好的。但是请注意,大多数情况下,您不需要过程代码。发布真正的问题,您可能会对答案感到惊讶。在这种情况下,我必须创建派生表,如果某些字段具有特定的值,则会根据返回某些状态的传入值创建特定的状态代码纯业务逻辑。该业务逻辑可能可以使用查询中的EXISTS来实现,甚至是一个查找表。函数是昂贵的,请参阅下面@Tometzky答案中的不可变严格选项+备注。我得到一个错误:错误:列arg不存在。我得到一个错误:错误:列arg不存在。感谢这些提示!谢谢你的建议!
create function getf(arg text) returns int
immutable strict language sql as $$
  select case 
    when arg = 'a' 
      then 1
      else 2 
    end
$$;