PostgreSQL数据库实现阶乘方法几个实例总结

作者:袖梨 2022-06-29

PostgreSQL 功能庞大,对实现乘法这类运算有诸多的方法,今天我来简单列举下以下几种便捷的途径。
比如我们要计算10!

1、 可以用SQL给它展开:


    t_girl=# select 1*2*3*4*5*6*7*8*9*10 as multiply_10;
     multiply_10
    ------------
        3628800
    (1 row)


    Time: 0.854 ms



2、 用WITH递归


    t_girl=# with recursive g(m,n) as
    t_girl-# (select 1 m, 10 n
    t_girl(# union all
    t_girl(# select m*n, (n-1) n from g where n > 1
    t_girl(# )
    t_girl-# select max(m) as factorial_10 from g;
     factorial_10
    --------------
          3628800
    (1 row)


    Time: 3.893 ms



3、 用简单的函数来展开


    create or replace function func_get_factorial(
    f_number int
    ) returns bigint
    as
    $ytt$
      declare i int :=1;
      declare v_result bigint := 1;
    begin
      for i in 1 .. f_number loop
        v_result := v_result * i;
      end loop;
      return v_result;
    end;
    $ytt$
    language plpgsql;


    t_girl=# select func_get_factorial(10) as factorial_10;
     factorial_10
    --------------
          3628800
    (1 row)


    Time: 1.022 ms



4、 用游标和序列函数generate_series来展开


    create or replace function func_get_factorial2(
    f_number int
    ) returns bigint
    as
    $ytt$
      declare cs1 cursor for select n from generate_series(1,f_number,1) as g(n);
      declare v_result bigint := 1;
      declare v_n bigint := 0;
    begin
        open cs1;
        loop
            fetch cs1 into v_n;
            exit when not found;
    v_result := v_result * v_n;
        end loop;
        close cs1;
      return v_result;
    end;
    $ytt$
    language plpgsql;


    t_girl=# select func_get_factorial2(10) factorial_10;
     factorial_10
    --------------
          3628800
    (1 row)


    Time: 2.238 ms
    t_girl=#





5、 用自定义python函数


    create or replace function func_get_factorial_py(
    f_number int
    ) returns bigint
    as
    $ytt$
    m = 1
    n = 1
    for i in range(1,f_number+1):
        m = m * i
    n = m
    return n
    $ytt$
    language plpythonu;


    t_girl=# select func_get_factorial_py(10) factorial_10;
     factorial_10
    --------------
          3628800
    (1 row)


    Time: 1.060 ms


相关文章

精彩推荐