基本SQL用户定义的函数,无法正常工作

时间:2013-03-17 21:18:26

标签: sql function postgresql stored-procedures operator-precedence

我正在尝试在SQL中编写一个函数,该函数输出一个团队在一个赛季的棒球比赛中的胜率。

CREATE FUNCTION
calc_winning_percentage(IN w integer, IN l integer, OUT p numeric)
RETURNS numeric AS $$
    SELECT $1 ::numeric/$1 + $2 AS p;
$$ LANGUAGE SQL;

这是当前的功能。应该死得很简单。 W =胜利。 L =损失。 P =百分比。 你获胜(w)并将其除以胜利+损失(w + l)。理论上,这给出了胜率。

我拿了一些已经提供的数据并尝试插入它。它很接近,但它不对。假设我们有一支96胜63负的球队。如果你拿这两个数字并加起来,你会得到159. 96/159 =〜.604。但是,当我用查询运行这些数字时,我得到64.0000。

我在编写其他语言的函数时并不是很糟糕(我承诺),所以我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

Operator precedence

CREATE OR REPLACE FUNCTION calc_winning_percentage(
     w integer
    ,l integer
    ,OUT p numeric)
  RETURNS numeric AS
$func$
    SELECT $1::numeric / ($1 + $2)
$func$ LANGUAGE SQL;

($1 + $2)周围需要括号。

您可以将其构建到您的函数中:

CREATE OR REPLACE FUNCTION calc_winning_percentage_rd3(
  w integer, 
  l integer,
  OUT p numeric)
RETURNS numeric AS
$func$
SELECT round($1::numeric/($1 + $2), 3)
$func$ LANGUAGE SQL;

您可以将round()应用于上面的函数,如下所示:

SELECT round(calc_winning_percentage(1000, 29), 3);

-> SQLfiddle demo

请注意,round() with two parameters需要numeric作为第一个输入。