我们将获得高度等级,但我为所有玩家获得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');
答案 0 :(得分:1)
如果我纠正了两个错误,你的功能对我来说很好:
您的其中一个逗号不是逗号,而是“fullwidth comma”,UNICODE代码点FF0C,会导致语法错误。
您有一个变量名offset
,这会导致SQL语法错误,因为它在SQL中是reserved key word。如果确实需要使用该名称,则必须将其全部用双引号("
)括起来,但最好选择其他名称。
导致问题的原因是PL / pgSQL中的offset := offset + 1;
之类的赋值被转换为SELECT offset + 1 INTO offset;
之类的SQL语句。
您可以在单个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';