2009-06-25 11 views
1

いくつかの数値を計算するいくつかのSQL文があります。ボーナスポイント/ペナルティポイントでは、最終スコアがボーナスポイントで100点以上、または0未満の場合にペナルティが発生する可能性があります。私はどのようにそれが100を超えた場合、私はそれが0SQL Serverでハードコーディングされた天井と床を定義するにはどうすればよいですか?

でmin'dだ、スコアが0未満になってしまう場合には、代わりの限界に達し100での取得、値が計算されていることを確認することができます

この数学を行う単純なUDFを使うことができたら、それは難しくありません。これが既に存在するかどうかわからないのですか?

私はCEILINGMAXをチェックアウトしています。これらは両方とも、私が何をしているのではなく、他のことをしています。

思考?

答えて

1

TES、それはいいだろう他の人が提案したことを正確に行うことができます: "MIN(Score、100)"など。悲しいことに、そうすることはできません。

これを行う一般的な方法は、CASE式である:

SELECT 
    CASE WHEN Score BETWEEN 0 AND 100 THEN Score 
     WHEN Score < 0 THEN 0 
     ELSE 100 END as BoundScore 
FROM YourTable 
+0

そのcase文がスカラー値関数であった場合、パフォーマンス上のペナルティはありますか? –

+0

はい。どのくらいかはわかりませんが、通常、大きな行セットの場合は重要です。 – RBarryYoung

0

スコアが表の列に格納されているか、またはこれらの制約で計算された合計があることを意味しますか?

一般に、おそらく最も簡単なのは、挿入されている値を確認するトリガーにロジックを入れ、範囲外であれば最大値または最小値に変更することです。

または、データベースの整合性の問題ではなく、アプリケーションの検証の問題であるため、抽象度が値を挿入して使用することです。

+0

スコアが計算され、(まだ)任意のテーブルのフィールドに格納されていません。私はすでに、最終価値を保持するフィールドにチェック制約があります。しかし、カスタムスカラー関数(別名UDF)がうまくいくかどうかは疑問でした。 –

0

トリガーは本当に正しい(そして唯一の解決策です)。

UPDATEとINSERTの両方(またはUPDATEとINSERTの2つの独立したトリガー)の両方で起動するトリガーが必要です。その列の提案された新しい値を確認し、必要に応じてそれを上下に押します。

http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

制約はオプションとなりますが、非常に強くお勧めします。

+0

私はトリガーが唯一の解決策である理由も理解できません。どうして?私は選択クエリで数学/計算を行っています。なぜ結果をいくつかのテーブルに保存する前に、結果を修正できないのですか? –

0

あなたはXXXは、あなたがスコアを計算する必要がどのような既存のコードである方法に関する

MIN(MAX(XXX、0)、100)、その後、トリガを使用しない場合。

例:SQL ServerはANSI-SQL "水平" の集計を持っていた場合はMIN(MAX(enemiesKilled + 10 * LivesLeft + * 15 *和(PrincessRescued)、0)、100)

+0

それは私も同じだと思ったのですが、MIN/MAXは1つの引数しか受け付けません。 waのような? –

関連する問題