基于另一个表中的公式的列计算

时间:2020-12-19 10:28:52

标签: mysql sql database postgresql formula

例如,假设我们有一个表格,其中包含一个公式的 id 和一个公式本身。第二个表将具有值的 id 和值本身,它们将用于公式。

所以,有一个表格,它连接公式和值,就像一个公式的模板。例如,公式#1 的结果要根据#5、#16 和#228 的值计算。

问题是:每个公式使用不同的值和不同的数量和不同的方式,但相同的值可以用于不同的公式。例如,公式#1 计算为#228 - #16 * #5,而公式#2 计算为#16 * #228 + #356。

这就引出了一个问题,有没有办法根据选择语句和预定义的公式制作计算列?公式将手工写入数据库中,而不是生成,因此公式可以基于值IDS。

我还没有为我的项目选择数据库引擎,因为我很好奇是否有任何引擎完全支持这种东西?

我对数据库领域有一些了解,但我缺乏专业知识,所以想请教该领域更有经验的程序员。

1 个答案:

答案 0 :(得分:1)

您将如何找到实际公式和输入参数并不完全清楚。但是您可以编写一个 PL/pgSQL 函数,将给定的输入字符串计算为 SQL 表达式:

create function eval(p_formula text, variadic parameters numeric[])
  returns numeric
as
$$
declare
  l_result numeric;
  l_sql text;
begin
  for idx  in 1..cardinality(parameters)  loop
    p_formula := replace(p_formula, concat('$', idx), parameters[idx]::text);
  end loop;
  execute 'select '||p_formula
     into l_result;
  return l_result;
end;  
$$
language plpgsql;

然后 select eval('$1 * $2 + $3', 3, 4, 5) 返回 17

然而,上面的函数对于没有传递的参数并不宽容。使用公式 $3 + $6 - $1 必须至少传递 6 个参数,否则会抛出错误。