2017-03-19 53 views
0

我們將有高度的排名,但我對所有球員 得到0我轉換英尺和英寸爲釐米第一,並使用示例代碼老師給我們。 這裏是我的代碼:得到玩家的高度的排名在PLPGSQL

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

你的功能工作正常,我如果我糾正兩個錯誤:

  1. 你的一個逗號是不是真的一個逗號,但「 fullwidth comma 」,UNICODE碼指向FF0C,這會導致語法錯誤。

  2. 您有一個變量名稱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'; 
+0

非常感謝。但我們假設寫一個函數而不是查詢。我想仔細檢查我的逗號和改變它,也重命名變量名,但仍然不能得到正確的輸出。我總是得到0或1 – lilywang

+0

那麼對你的最好的事情是編輯的問題,並添加樣本數據和演示它是如何去錯了,因爲它爲我工作。 –