获得球员排名' plpgsql中的高度

时间:2017-03-19 22:12:04

标签: postgresql plpgsql

我们将获得高度等级,但我为所有玩家获得0 我首先将脚和英寸转换为cm,并使用示例代码老师给我们。 这是我的代码:

CREATE OR REPLACE FUNCTION player_height_rank (firstname VARCHAR, lastname VARCHAR) RETURNS int AS $$ 

DECLARE
rank INTEGER:= 0;
offset INTEGER:= 0;
tempValue FLOAT:= NULL;
r record;
BEGIN

FOR r IN SELECT ((p.h_feet * 30.48) + (p.h_inches * 2.54)) AS height, p.firstname, p.lastname
FROM players p
ORDER BY ((p.h_feet * 30.48) + (p.h_inches * 2.54)) DESC, p.firstname, p.lastname


LOOP

    IF r.height = tempValue then
        offset := offset + 1;
    ELSE
        rank := rank + offset + 1;
        offset := 0;
        tempValue := r.height;
    END IF;

    IF r.firstname = $1 AND r.lastname = $2 THEN
        RETURN rank;
    END IF;
END LOOP;

-- not in DB
RETURN 0;

END;
$$ LANGUAGE plpgsql;

--select * from player_height_rank('Ming', 'Yao');

1 个答案:

答案 0 :(得分:1)

如果我纠正了两个错误,你的功能对我来说很好:

  1. 您的其中一个逗号不是逗号,而是“fullwidth comma”,UNICODE代码点FF0C,会导致语法错误。

  2. 您有一个变量名offset,这会导致SQL语法错误,因为它在SQL中是reserved key word。如果确实需要使用该名称,则必须将其全部用双引号(")括起来,但最好选择其他名称。
    导致问题的原因是PL / pgSQL中的offset := offset + 1;之类的赋值被转换为SELECT offset + 1 INTO offset;之类的SQL语句。

  3. 您可以在单个SQL查询中完成所有操作,这样更有效:

    SELECT rank
    FROM (SELECT firstname,
                 lastname,
                 rank() OVER (ORDER BY h_feet + 12 * h_inches)
          FROM players
         ) dummy
    WHERE firstname = 'Ming'
       AND lastname = 'Yao';