如何在Sql Server中定义自己的硬编码天花板和楼层?

时间:2009-06-25 05:26:31

标签: sql sql-server tsql

我有一些sql语句可以计算一些数字。有可能(有奖励积分/罚分)一个人最终得分超过100(有奖励积分)或 低于0(有罚款)。

如何确保计算出的值,如果超过100则得到最大值为100.或者,如果得分最终低于0,那么它最小为0。

我假设我可以使用一个简单的UDF来做这个数学 - 这并不难。我不确定这是否已经存在?

我查看了CEILINGMAX,其中两个都在做其他事情,而不是我要追求的事情。

思想?

4 个答案:

答案 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)