Вау! Я вижу, что это слишком сложно сделать простым: Max(Field-Constant1,Constant2)
.
Моя цель: вычислить значение, зависящее только от одного поля, но не допускать, чтобы вычисленное значение было меньше константы.
Пример строк в таблице из двух полей (KeyField, ValueField):
1 10
2 5
3 8
4 Null
Я хочу выбрать, который возвращает (когда Constant1 = 6 и Constant2 = 1), я поставил все математические вычисления, чтобы прояснить это (только самая верхняя правая часть после последнего = это то, что я хочу):
1 Max(10-6,1)=Max(4,1)=4
2 Max(5-6,1)=Max(-1,1)=1
3 Max(8-6,1)=Max(2,1)=1
4 Max(Null-6,1)=Max(Null,1)=Null
Так что я просто хочу (когда Constant1 = 6 и Constant2 = 1) на случай, если недостаточно ясно:
1 4
2 1
3 1
4 Null
Остерегайтесь этого Нуль.
Я действительно хочу что-то действительно более сложное, но решив, что я смогу решить сложный, который я хочу.
Это может быть возобновлено как:
-Return Null, если значение равно Null или не является допустимым значением для используемого математического оператора (не всегда это просто - или +, и т. Д.)
-Возвратите вычисленное значение, если возможно выполнить математику, но ограничено диапазоном (не меньше значения и не больше другого значения).
Если я сделаю это на псевдокоде, это будет выглядеть так:
try // try to do the maths
MyCalculatedValue=SomeMaths(FieldValue);
MyCalculatedValue=Min(Max(MyCalculatedValue,MinValue),MaxValue);
except // In case the SomeMaths can not be done (FieldValue is Null, negative square, division by zero, etc)
MyCalculatedValue=Null;
end;
return MyCalculatedValue;
На всякий случай, если кто-то скажет, что база данных не нормализована: я хочу выполнить некоторые математические операции с полем, а затем ограничить результат диапазоном; таким образом, самая маленькая примерная база данных будет иметь только одну таблицу, которая будет иметь только два поля (поле уникального ключа, поле данных), которое невозможно полностью нормализовать; я не говорю о maximun некоторых полей в строке, ни maximun для полной таблицы в поле (агрегатные функции), просто я просто хочу установить нижний и верхний пределы для вычисляемого значения, но рассматриваю Null, когда такое значение Нуль, или математические вычисления, которые должны быть выполнены с таким значением, не могут быть выполнены (такие случаи, как Constant1 / (FieldValue-Constant2) и т. д.).
Реальный образец на тот случай, если кто-то не получит, когда это можно использовать:
Поля таблицы:
ID (Key)
SpacePosition (DecimalData)
Желаемые поля результатов для запроса:
ID as ID
Min(Max(SpacePosition-SomeSpaceLongitud,StartPosition),EndPosition) AS RangeStart
Min(Max(SpacePosition+SomeSpaceLongitud,StartPosition),EndPosition) AS RangeEnd
Надеюсь, что образец ясен, и надеюсь, что кто-то может помочь, с чем-то более простым, чем использование функций VBA!
П.Д .: Подумайте, что такие математические вычисления более сложны, чем просто + и -, и таблица содержит намного больше регистров, чем несколько, подумайте о нескольких миллиардах регистров.
P.P .: Не стоит жестко кодировать такие результаты, поскольку это не будет нормализованная база данных и, что хуже всего, такие пределы диапазона являются значениями, вводимыми пользователем при выполнении запроса.