0

場所(P)とレーサーの数(R)に基づいたスコアリングポイントと、points_idで示されるスコアリング形式をルックアップするテーブルがあります。表には2つのケースが示されています。ポイントは、points_id = 3のように、PとNの値によって直接決定される場合もあれば、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   |

3つの入力変数からポイントを返す関数を作成したいと思っていました。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(tbd)に移ります。

4

1 に答える 1

0

列の代わりに3つの数値列を使用した方がよいと思いますpts_calc

  1. cPINpin-項の係数
  2. cNINnin-項の係数
  3. cnst-定数項

次に、関数は次のことを実行できます。

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

必要に応じて、他の2つを0のままにpointsして、列を削除することもできます。cnst

于 2012-04-29T15:56:20.563 に答える