Корректность вычислений в запросах при значении операнда NUL

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
GAndy
Сообщения: 4
Зарегистрирован: 07 окт 2005, 13:20

Корректность вычислений в запросах при значении операнда NUL

Сообщение GAndy » 07 окт 2005, 14:57

Добрый день!
Подскажите, как выйти из сложившейся ситуации :
есть запрос
select ((select ...) - (select ...)) as val_1 from ...
в некоторых случаях один из операндов принимает значение NULL и следовательно все выражение принимает значение NULL. Как сделать так, чтобы в случае null операнда он интерпретировался как 0 (ноль)?
Хранимую процедуру писать не хочется из-за такого пустяка.
СПАСИТЕ!!!

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 07 окт 2005, 15:44

Функция COALESCE() спасет отца русской демократии

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 07 окт 2005, 16:28

Особенно если он живёт на IB6.0. Мутит уже от вопрошающих.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 окт 2005, 17:57

еще вариант - не хранить null.

GAndy
Сообщения: 4
Зарегистрирован: 07 окт 2005, 13:20

Сообщение GAndy » 10 окт 2005, 12:55

Функцию COALESCE() в описани по версии 6.1 не нашел, наверное в старших версиях или FB. Не хранить нулл можно, но когда речь идет о результатах выборки, которая ничего не вернула, то тут сразу и сложнее - вопрос не решается.
Выход я нашел в UDF следующего содержания:
function IntNULL20(var val:integer):integer ;cdecl;export;
begin
result:=val;
end;

Пока работает без ошибок. Если в этом коде есть опасность, предупредите пожалуйста!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 окт 2005, 13:00

а ты не используй null, если они тебе не нужны.

GAndy
Сообщения: 4
Зарегистрирован: 07 окт 2005, 13:20

Сообщение GAndy » 12 окт 2005, 16:51

kdv писал(а):а ты не используй null, если они тебе не нужны.
Результатом выполнения запроса является результат арифметического действия над результатами выполнения двух независимых запросов. При этом есть вероятность (гораздо больше 1%, а в некоторых обстоятельствах даже 100%) что один из этих запросов вернет пустое множество строк, тоесть совсем ничего и не NULL оно быть не может. Не знаю я механизмов заставить вернуть 0 если там ничего нет. Вот я и спрашиваю, а не знает ли кто из посещающих здесь ГУРУ. Найденный мною выход через UDF меня устраивает, но ковыряться в исходниках сервера и выяснять всегда ли IB в UDF пошлет ноль, если значение null, меня не очень прильщает.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 12 окт 2005, 18:31

не надо нигде ковыряться. udf вернет только то, что ты написал.

версия IB 6.1, между прочим, платная. В любом случае что 6.0 что 6.1 уже давно не рекомендуются к использованию.

GAndy
Сообщения: 4
Зарегистрирован: 07 окт 2005, 13:20

Сообщение GAndy » 13 окт 2005, 15:31

Я дико извиняюсь, версия IB 6.0.2.0, но не в этом суть. Она вроде как бесплатная и для решения частных не больших задач локально работающих вполне даже подходит. А лишний раз думать о том, что пользуешь неразрешенное не очень хочется. Да и народ до сих пор нормально юзает 5.6.
.. но это тступление.
Собственно вопрос не в том, что вернет, а что получит? Всегда ли при передаче удээфине ибейс будет нулл заменять на ноль, или может случиться непредвиденное?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 окт 2005, 09:57

IB 6.0.2.0, но не в этом суть. Она вроде как бесплатная
версию от mers.com вообще на порог нельзя пускать.
для вас же писано и в faq, и тут
www.ibase.ru/devinfo/allversions.htm

Ответить