Страница 1 из 1
Корректность вычислений в запросах при значении операнда NUL
Добавлено: 07 окт 2005, 14:57
GAndy
Добрый день!
Подскажите, как выйти из сложившейся ситуации :
есть запрос
select ((select ...) - (select ...)) as val_1 from ...
в некоторых случаях один из операндов принимает значение NULL и следовательно все выражение принимает значение NULL. Как сделать так, чтобы в случае null операнда он интерпретировался как 0 (ноль)?
Хранимую процедуру писать не хочется из-за такого пустяка.
СПАСИТЕ!!!
Добавлено: 07 окт 2005, 15:44
Dimitry Sibiryakov
Функция COALESCE() спасет отца русской демократии
Добавлено: 07 окт 2005, 16:28
Merlin
Особенно если он живёт на IB6.0. Мутит уже от вопрошающих.
Добавлено: 07 окт 2005, 17:57
kdv
еще вариант - не хранить null.
Добавлено: 10 окт 2005, 12:55
GAndy
Функцию COALESCE() в описани по версии 6.1 не нашел, наверное в старших версиях или FB. Не хранить нулл можно, но когда речь идет о результатах выборки, которая ничего не вернула, то тут сразу и сложнее - вопрос не решается.
Выход я нашел в UDF следующего содержания:
function IntNULL20(var val:integer):integer ;cdecl;export;
begin
result:=val;
end;
Пока работает без ошибок. Если в этом коде есть опасность, предупредите пожалуйста!
Добавлено: 10 окт 2005, 13:00
kdv
а ты не используй null, если они тебе не нужны.
Добавлено: 12 окт 2005, 16:51
GAndy
kdv писал(а):а ты не используй null, если они тебе не нужны.
Результатом выполнения запроса является результат арифметического действия над результатами выполнения
двух независимых запросов. При этом есть вероятность (гораздо больше 1%, а в некоторых обстоятельствах даже 100%) что один из этих запросов вернет
пустое множество строк, тоесть совсем ничего и не NULL оно быть не может. Не знаю я механизмов заставить вернуть 0 если там ничего нет. Вот я и спрашиваю, а не знает ли кто из посещающих здесь ГУРУ. Найденный мною выход через UDF меня устраивает, но ковыряться в исходниках сервера и выяснять всегда ли IB в UDF пошлет ноль, если значение null, меня не очень прильщает.
Добавлено: 12 окт 2005, 18:31
kdv
не надо нигде ковыряться. udf вернет только то, что ты написал.
версия IB 6.1, между прочим, платная. В любом случае что 6.0 что 6.1 уже давно не рекомендуются к использованию.
Добавлено: 13 окт 2005, 15:31
GAndy
Я дико извиняюсь, версия IB 6.0.2.0, но не в этом суть. Она вроде как бесплатная и для решения частных не больших задач локально работающих вполне даже подходит. А лишний раз думать о том, что пользуешь неразрешенное не очень хочется. Да и народ до сих пор нормально юзает 5.6.
.. но это тступление.
Собственно вопрос не в том, что вернет, а что получит? Всегда ли при передаче удээфине ибейс будет нулл заменять на ноль, или может случиться непредвиденное?
Добавлено: 14 окт 2005, 09:57
kdv
IB 6.0.2.0, но не в этом суть. Она вроде как бесплатная
версию от mers.com вообще на порог нельзя пускать.
для вас же писано и в faq, и тут
www.ibase.ru/devinfo/allversions.htm