Как определить свои собственные жестко закодированные потолки и полы в Sql Server? - PullRequest
1 голос
/ 25 июня 2009

У меня есть несколько SQL-операторов, которые рассчитывают некоторые числа. Вполне возможно (с бонусными баллами / штрафными баллами), что человек может получить окончательный результат БОЛЕЕ 100 (с бонусными баллами) или ПОД 0 (со штрафами).

Как я могу убедиться в том, что вычисленное значение, если оно превышает 100, достигает максимального значения в 100. В качестве альтернативы, если счет в конечном итоге оказывается ниже 0, то его значение равно min.

Я предполагаю, что мог бы использовать простой UDF, который выполняет эту математику - это не сложно. Я не уверен, что это уже существует?

Я проверил Потолок и MAX , и оба они занимаются другими вещами, а не тем, что мне нужно.

Мысли

Ответы [ 4 ]

1 голос
/ 25 июня 2009

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
0 голосов
/ 25 июня 2009

Триггер действительно является правильным (и единственным решением).

Вам необходим триггер, который срабатывает ПЕРЕД как UPDATE, так и INSERT (или два отдельных триггера, один для UPDATE и один для INSERT). Просто проверьте предложенное новое значение для этого столбца и нажмите его вверх или вниз, если необходимо.

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

Ограничение становится необязательным, но очень настоятельно рекомендуется.

0 голосов
/ 25 июня 2009

Если вы не хотите использовать триггер, как насчет

MIN (MAX (XXX, 0), 100) где XXX - это любой существующий код, который вы должны рассчитать для оценки.

например: MIN (MAX (убито врагов + 10 * LivesLeft + * 15 * sum (PrincessRescued), 0), 100)

0 голосов
/ 25 июня 2009

Вы имеете в виду, что счет хранится в столбце таблицы или есть некоторая вычисленная сумма с этими ограничениями?

В общем, возможно, проще всего было бы поместить логику в триггер, который проверял бы, какое значение вставляется, и изменить его на максимальное или минимальное, если оно выходит за пределы.

Или то, что я хотел бы сделать, это использовать любой уровень абстракции, вставляющий значение, для проверки, поскольку это не проблема целостности базы данных, а проблема проверки приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...