0

我有一个表格,可以根据 Place (P) 和 Number of Racers(R) 以及 points_id 指示的得分格式查找得分点。表中显示了两种情况。有时这些点直接由 P 和 N 的值确定,如 points_id =3 中的其他时间,它们最容易通过 pts_calc 列中显示的简单计算确定。

|points_id| P | N |points|pts_calc|    
|    1    | 0 | 0 | NULL | pin    |
|    1    |DNS| 0 | NULL | nin+1  |
|    3    | 1 | 0 |102.00| NULL   |
|    3    | 2 | 0 | 98.00| NULL   |
|    3    | 3 | 0 | 96.00| NULL   |
|    3    | 4 | 0 | 93.00| NULL   |
|    3    | 5 | 0 | 91.00| NULL   |
|    3    | 6 | 0 | 89.00| NULL   |
|    3    |DNF| 0 | 85.00| NULL   |

我希望创建一个从三个输入变量返回点的函数。points_id,P,N。下面是我尝试过的。

CREATE FUNCTION POINTS(pid INT,pin VARCHAR(3),nin INT)
RETURNS DEC(6,2)
DETERMINISTIC

BEGIN
DECLARE pts DECIMAL(6,2);
DECLARE pcalc VARCHAR(20);

SELECT points,pts_calc INTO pts,pcalc FROM scoring_points WHERE points_id=pid AND (P=pin OR P='0') AND (N=nin or N=0); 

IF(pts IS NULL) THEN
SET @s= CONCAT('SET pts = ',pcalc);
PREPARE stmt FROM @s;
EXECUTE stmt;

END IF;

RETURN pts;

END

但我得到了这个错误。

1336 - 存储函数或触发器中不允许使用动态 SQL

进一步的研究表明 Prepare 语句不仅在函数中被允许,而且在过程中被允许。我希望做类似的事情;

SELECT SUM(Points(pid,place,numb)) FROM t1 GROUP BY racer.id

但除非有人有好主意,否则请进入 B 计划(待定)。

4

1 回答 1

0

我认为使用三个数字列而不是列可能会更好pts_calc

  1. cPINpin-项系数
  2. cNINnin-项系数
  3. cnst- 常数项

然后您的函数可以执行:

SELECT IFNULL(points, cPIN*pin + cNIN*nin + cnst) INTO pts
FROM scoring_points
WHERE ...

根据您的需要,您甚至可以通过使用并使其他两个等于 0来摆脱该points列。cnst

于 2012-04-29T15:56:20.563 回答