我有一些sql语句可以计算一些数字。有可能(有奖励积分/罚分)一个人最终得分超过100(有奖励积分)或 低于0(有罚款)。
如何确保计算出的值,如果超过100则得到最大值为100.或者,如果得分最终低于0,那么它最小为0。
我假设我可以使用一个简单的UDF来做这个数学 - 这并不难。我不确定这是否已经存在?
我查看了CEILING和MAX,其中两个都在做其他事情,而不是我要追求的事情。
思想?
答案 0 :(得分:1)
Tes,如果SQL Server具有ANSI-SQL“水平”聚合函数会很好,那么你可以完全按照其他人的建议去做:“ 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
答案 1 :(得分:0)
您的意思是分数是存储在表格的列中,还是存在一些具有这些约束的计算总数?
一般情况下,最简单的方法可能是将逻辑放入触发器中,以检查插入的值,并将其更改为最大值或最小值(如果超出范围)。
或者,我要做的是使用插入值的任何抽象级别进行检查,因为它不是数据库完整性问题,而是应用程序验证问题。
答案 2 :(得分:0)
触发器确实是正确的(也是唯一的解决方案)。
你需要一个在UPDATE和INSERT之前触发的触发器(或两个单独的触发器,一个用于UPDATE,一个用于INSERT)。只需检查该列的建议新值,并在必要时向上或向下推。
http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx
约束变为可选,但强烈建议使用。
答案 3 :(得分:0)
如果您不想使用触发器那么
MIN(MAX(XXX,0),100)其中XXX是您必须计算分数的现有代码。
例如:MIN(MAX(敌人杀死+ 10 * LivesLeft + * 15 *总和(PrincessRescued),0),100)