【问题标题】:Postgresql function with if statement带有 if 语句的 Postgresql 函数
【发布时间】:2015-01-29 19:13:24
【问题描述】:

如何让这个伪代码在 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 替换为 when 子句,但不知道该怎么做。

谢谢!

【问题讨论】:

  • 你使用的是sql语言,对于它here你可以找到正确的IF THEN语句指令
  • @Patrick 的回答很好。但请注意,大多数时候您不需要过程代码。发布真正的问题,您可能会对答案感到惊讶。
  • 在这种情况下,我必须创建派生表,以防某些具有某些值的字段创建特定的状态代码(基于返回某些状态的传入值的纯业务逻辑)。
  • 这个“业务逻辑”可能可以在查询中使用EXISTS() 来实现,甚至可以使用查找表。功能很昂贵,请参阅下面@Tometzky 答案中的immutable strict options+remark。

标签: postgresql function


【解决方案1】:
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】:

    使用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;
    

    【讨论】:

    • 我收到一个错误:错误:列“arg”不存在。
    【解决方案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 );
    

    【讨论】:

      【解决方案4】:
      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 值,它可能会掩盖这个错误并使其更难调试它是否会为 NULL 返回 2。

      【讨论】:

      • 感谢这些提示!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多