为什么Postgres的exp / log结果与SQL Server不同?

时间:2009-09-29 06:23:31

标签: sql-server postgresql

我的盒子上没有SQL Server,但为什么以下answer不会在Postgres上返回360?

select exp(sum(log(val)))
from (values(4),(5),(3),(6)) as tbl(val)

返回12.888075

1 个答案:

答案 0 :(得分:3)

你必须使用自然对数(ln函数),而不是base-10对数(log函数):

select exp(sum(ln(val)))
from (values(4),(5),(3),(6)) as tbl(val)

 exp 
-----
 360
(1 row)

但这不是一个乘以行的好方法 - 由于四舍五入,它很慢且容易出错。你应该声明一个聚合:

create function multiply(int,int) returns int as $$
  select $1*$2;
$$ language sql immutable strict;

create aggregate multiply(int) (
  sfunc=multiply,
  stype=int,
  initcond=1
);

select multiply(val)
from (values(4),(5),(3),(6)) as tbl(val)
 multiply 
----------
      360
(1 row)