使用if语句的Postgresql函数

时间:2015-01-29 10:26:15

标签: 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;

基于参数我需要返回一些值,而我没有其他需要查询的表。只需要在函数内部构建一个逻辑。 试图用if子句替换if,但无法弄清楚如何做到这一点。

谢谢!

4 个答案:

答案 0 :(得分:4)

使用sql语言,您可以使用case when

执行此操作
create or replace function getf(arg character varying(255)) returns int as
 $$

select case 
        when arg = 'a' 
         then 1
         else 2 
       end

$$ language sql;

答案 1 :(得分:3)

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有一个很好的章节。这应该提供了开始编写程序功能所需的一切,并且支持逻辑分支。

答案 2 :(得分:3)

纯SQL函数。这很难看,因为SQL没有IF。 (您可以使用CASE代替,这也很丑陋。需要DISTINCT FROM来捕获NULL。

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

答案 3 :(得分:1)

create function getf(arg text) returns int
immutable strict language sql as $$
  select case 
    when arg = 'a' 
      then 1
      else 2 
    end
$$;

这几乎就像Houari的答案,但是:

  • 它使用text作为参数类型 - 在Postgres中限制参数长度没有意义,其中表示没有区别;
  • 它是immutable,因此数据库可以从同一个参数缓存它的结果,这可能更快;
  • 它是strict,因此它不会在NULL值上运行并且只返回NULL,因为它可能是一个编程错误,无论如何它都要用在NULL值上,它可能会掩盖如果它返回2为NULL,则此错误会使调试变得更加困难。