Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.03;
Скачать: CL | DM;

Вниз

NVL в Interbase   Найти похожие ветки 

 
ilandrei ©   (2003-03-13 17:28) [0]

Народ, помогите!
Наверняка такая проблема не у меня одного - но как-то ведь, наверное, решается? Нужно вернуть в SQL-запросе сумму нескольких столбцов. И все бы ничего, но если хотя бы в одном из этих столбцов NULL, то и сумма получится тоже NULL, а это меня не устраивает! В Oracle было бы проще простого - используй NVL, и все дела! А в Interbase что делать?


 
Соловьев ©   (2003-03-13 17:32) [1]

ХП попробуй.


 
Johnmen ©   (2003-03-13 17:35) [2]

UDF


 
Deniz ©   (2003-03-13 17:36) [3]

UDF


 
Соловьев ©   (2003-03-13 17:36) [4]

select sum(field)
from table
where field is not NULL


 
Dred2k ©   (2003-03-13 17:38) [5]

Поиграйся приведением типов в выражении суммирования.
Пусть даже через число(возможно - NULL)->строка->число(нужно получить 0) - может помочь, а на скорость не особо должно повлиять...


 
Johnmen ©   (2003-03-13 17:44) [6]

>Dred2k © (13.03.03 17:38)

Не-а...


 
Dred2k ©   (2003-03-13 17:48) [7]

2 Johnmen

Коли так, то Соловьев © верно подметил...


 
Johnmen ©   (2003-03-13 17:51) [8]

>Dred2k © (13.03.03 17:48)

Что верно подметил ?


 
Dred2k ©   (2003-03-13 17:55) [9]

Что-что, select с where.
Хотя и не понятно поведение ib - даже bde так не делает. :)


 
ilandrei ©   (2003-03-13 17:55) [10]

А что такое ХП?

> Соловьев ©

Вы меня неправильно поняли. Мне-то нужно не SUM, а Column1 + Column2 + Column3


 
Johnmen ©   (2003-03-13 17:58) [11]

>Dred2k © (13.03.03 17:55)
>Что-что, select с where.

Неверно подметил, т.к. подумай над SUM(F1+F2) (у автора)...

>...даже bde так не делает. :)

Как так ?




 
Соловьев ©   (2003-03-13 17:58) [12]

частный случай:
select Column1 + Column2 + Column3
from table
where (Column1 is not NULL) and (Column2 is not NULL) and (Column3 is not NULL)
А вот ХП - это через хранимую процедуру в БД.


 
Dred2k ©   (2003-03-13 18:04) [13]

> Как так ?

Да так. NULL в таблице хоть парадокса, хоть дбф - это 0 для числовых полей. Запрос на ib через SQLLink не охота пробовать... ;)
Предположить можно одно: серверный ib слишком по-философски воспринимает NULL (насчет сложения с ним), либо у автора случайно умножение закралось, либо тогда ой... ;)


 
Dred2k ©   (2003-03-13 18:06) [14]

Насчет предложенного селекта согласен - не катит, поскольку не выберет всех возможных вариантов.
Пиво я пью, внимание расслаблено.....
Красота.
;-)~


 
ilandrei ©   (2003-03-13 18:08) [15]

>select Column1 + Column2 + Column3
>from table
>where (Column1 is not NULL) and (Column2 is not NULL) and (Column3 is not NULL)

По такой схеме даже для трех столбцов должно получиться что-то немыслимое, потому что мне-то ведь нужно вернуть результат и для тех случаев, когда в каком-то из столбцов живет NULL, а если столбцов будет, не дай Бог, больше трех?
Да и UDF здесь едва ли поможет. Судя по всему, хранимая процедура - единственно возможное решение для такого, в сущности, элементарного случая.
Будь проклят тот день, когда я сел за баранку этого пылесоса!


 
Desdechado ©   (2003-03-13 19:37) [16]

>Да и UDF здесь едва ли поможет
зря так. поможет. возьми RLib на ibase.ru и там примитивная до ужаса функция Z - она null в ноль превращает


 
zacho ©   (2003-03-13 20:32) [17]


> Dred2k © (13.03.03 17:55)
> Хотя и не понятно поведение ib - даже bde так не делает.
> :)

Мне так очень даже понятно :)
NULL вообще-то может интерпретироваться двояко:
1. Значение отсутсвует.
2. Значение неизвестно.
Ну и что должно быть в результате, например, 1+5+<неизвестное число>+7 ? По-моему, именно неизвестно что, т.е. NULL

to ilandrei ©
Советую обратить внимание на Yaffil, там есть IIF. Например,в твоей ситуации помогло бы SELECT .., IIF(FIELD1 IS NULL,0,FIELD1)+IIF(FIELD2 IS NULL,0,FIELD2)+..
Или перепроектируй свою БД так, чтобы в ней не было NULLов.


 
Dred2k ©   (2003-03-13 20:49) [18]

2 zacho

> Мне так очень даже понятно :)
Тогда почему два варианта? Такого, кажется, не бывает.
> NULL вообще-то может интерпретироваться двояко:
> 1. Значение отсутсвует.
Да. Нет инфы, то бишь. Яволь полюбому.
И тут две интерпритации - 0 и пустота. И то, и другое, по большому счету не должно влиять на результат. Насчет отсека "другое" - мое скромное философское представление. Хотя, это может превратить результат в пустоту. Но это при умножении верно на 100, а здесь... Вопрос.
> 2. Значение неизвестно.
Это что-то новенькое...


 
ilandrei ©   (2003-03-13 21:02) [19]

Господа, все философские рассуждения о том, что такое поле NULL, вряд ли будут новостью для программистов. Безусловно, что сумма N членов, хотя бы один из которых NULL, тоже должна быть NULL. Но я категорически не согласен с отсутствием в Interbase какой-либо очевидной возможности превращать NULL в 0 или же во что-нибудь еще. Увы, если это все же так.
А перепроектировать БД не могу - не моя-с... По той же причине не обращаю внимание на Yaffil.
Попробую с UDF, коли так...


 
Dred2k ©   (2003-03-13 21:10) [20]

2 ilandrei
Попробуй все же cast(cast(... as char(20)) as ЧИСЛО) - у меня просто нет такой возможности, а люди говорят, что бесполезно. Ну не верю на слово...
"Надо помазать!" (с) Пилюлькин, кажется.
;)


 
Johnmen ©   (2003-03-13 21:22) [21]

>Dred2k © (13.03.03 21:10)

Не предлагай ерунды ! Твоя так называемая "программерская интуиция" сбоит по-черному...
Короче, не отвлекайся от пива !


 
zacho ©   (2003-03-13 21:38) [22]


> Dred2k © (13.03.03 20:49)

Не буду отвечать подробно. Лень. Лучше отошлю к классикам, например к Дейту.

> Dred2k © (13.03.03 21:10)

Не работает и работать не должно. NULL он и в varchar, и в чем угодно NULL. А CAST (.. AS ЧИСЛО) - это что-то новое в SQL.

> ilandrei © (13.03.03 21:02)

Конечно, попробуй. Похоже UDF - для тебя сейчас лучшее решение.


 
Dred2k ©   (2003-03-13 21:54) [23]

2 zacho

> Не буду отвечать подробно. Лень.
Лень - грех. По фильму 7 - номер забыл...
Таких мессаг на каждый вопрос накидать - и круто будет.
Правда?
> Лучше отошлю к классикам, например к Дейту.
Красивое слово. И сказано веско.
Ты и правда ленив чрез меры - даже не потрудился уточнить, что мне искать у него. Особенности ib или концепцию NULL? Ну да ладно, догадался - NULL.
Май маста! (голос при этом могуч и загробен).
Прочту. При необходимости, правда.
Скромный интерес - вы только char-ы "Дейт" освоили, или знания имеют место быть? Если есть - то и кратко сможешь...
Интересно существо проблемы (если отойти от лирики).
И нужно уважать читателей.

> Не работает
Вполне возможно.
> и работать не должно.
Аргументы на бочку (интерес есть, живой и искренний). Можно "про Дейта". Если в тему - получится кратко. Мы уж поймем как нить....
> NULL он и в varchar, и в чем угодно NULL.
Сильно и точно. Полюбому.
> А CAST (.. AS ЧИСЛО) - это что-то новое в SQL.
В каком из них? Их же много. Диалектов. Нет? (щас опять "отошлют" ...).
Открою тайну - в неполноценном и тщедушном, всеми обсераемом (сорри!) LocalSQL.
В других не помню сам, поэтому то не панацея была, а _просьба_ проверить. Причем, к автору вопроса. Ему интерес живей, чем таким вот как мы "вольным снайперам" ...
Удачной охоты.


 
zacho ©   (2003-03-13 22:51) [24]


> Dred2k © (13.03.03 21:54)

Зачем такой тон ? Извини, если обидел. Не хотел, серьезно. Кстати, сейчас у нас уже ночь, т.ч. если эта нить будет продолжатся, то скорее всего отвечу только завтра.
Теперь по существу:

> Таких мессаг на каждый вопрос накидать - и круто будет.
> Правда?
> > Лучше отошлю к классикам, например к Дейту.
> Красивое слово. И сказано веско.

Слишком много писать. Не зря,например, в epsylon.public.interbase до сих пор иногда "бушуют NULL-овые войны". А Дейта я привел, просто потому, что насколько я помню, про "двойственность NULL" и т.п. у него было весьма хорошо написано. Впрочем, если хочешь - приведу и свою точку зрения, но - с утра.

<далее skip>


> Аргументы на бочку

Пожалуйста:
CAST - преобразования типа данных. NULL в любом типе данных останется NULL"ом. Есть возражения? Приведи. Если нет - тогда почему CAST(NULL AS что-то) должен превратиться в 0 ?


> > А CAST (.. AS ЧИСЛО) - это что-то новое в SQL.
> В каком из них? Их же много. Диалектов. Нет? (щас опять
> "отошлют" ...).
> Открою тайну - в неполноценном и тщедушном, всеми обсераемом
> (сорри!) LocalSQL.

Может я неправильно тебя понял. Но под ЧИСЛО я понял конкретное число. Например, 0. Если такое (CAST FIELD AS 0) и работает в LocalSQL, то во-первых все равно imho бред, во-вторых - вопрос-то был про IB, где это не работало никогда.


 
Dred2k ©   (2003-03-13 23:07) [25]

2 zacho

Какие тут обиды. Просто твой ответ - не ответ, а гонор. Согласись.
Мой пост тоже не сахар... ;)

Завтра попишем-почитаем. Я домой уже опаздываю.
На некоторое сразу отвечу.

Насчет эхи и Дейта вопросов нет. Эху не читаю, поскольку и ib не юзаю. Оттого и вопрос был как просьба заделать эксперимент. Дейт, понятно, пишет дело. Философский спор и не поддержу - на практике не поможет. Вот сейчас как раз об этом.

> CAST - преобразования типа данных. NULL в любом типе данных
> останется NULL"ом.

Оба утверждения - true. Я об этом уже говорил.
А ЧИСЛО - это вольное обозначение на месте реального имени реального числового поля (int, float и т.п. - надеюсь, о конкретике типов спорить не будем, смысл ясен).

> Если такое (CAST FIELD AS 0)
Нет, просто ты меня не понял (значит - я не объяснил ;( ).
;)
Ну, на сегодня - усё.
Завтра - и эксперименты, и кофе, и форум, и работа.
Пока.



 
Dred2k ©   (2003-03-13 23:11) [26]

Блин, спешка - мать опозданий!
Конечно - ЧИСЛО это не "вольное обозначение на месте реального имени реального числового поля", а вольное обозначение на месте реального имени числового типа данных.
:)


 
zacho ©   (2003-03-13 23:20) [27]

Ладно, понял, мой гонор тоже имел место быть:-)
Ложусь спать, если будет желание - продолжим завтра (хм... для меня - уже сегодня)


 
Johnmen ©   (2003-03-13 23:55) [28]

И с чего такой флуд ???
Один нажрался пива (Dred2k ©) и пытается философствовать на пустом месте. Хотя IB никогда толком не знал и общался с ним 6 (!) лет назад ! SQL тоже не знает (судя по "философии" ).

>zacho ©

Ты же разумный человек ! Зачем ведешься на пьяный глупый базар ???


 
Dred2k ©   (2003-03-14 09:33) [29]

2 Johnmen

А ты не суди особо. Надорвешься.


 
Sergey13 ©   (2003-03-14 10:11) [30]

2ilandrei © (13.03.03 17:28)
Чем извращаться при каждом запросе (cast&UDF) возми и сделай на эти поля дефолтом 0 и проапдейть все существующие (с Null поставь 0). И будет тебе счастье на всю оставшуюся жизнь.
Такие вещи вообще то рекомендуется делать при проектировании, но и исправить никогда не поздно.


 
Dred2k ©   (2003-03-14 10:23) [31]

Признание собственных ошибок - вещь зело важная.
Посему официально заявляю о тотальном провале моих рассуждений о NULL-е в тот же самый NULL ;)
В итоге нехитрых поисков отличие между поведением аггрегатной функции sum и поведением null в выражениях было достоверно установлено.

2 zacho
Отвлек. Прости. Бывает.
;))


 
myor ©   (2003-03-14 11:35) [32]

update table1
set field1=0
where field1 is null,
field2=0
where field2 is null,
...
select sum(field1+field2+...) from table1


 
Anatoly Podgoretsky ©   (2003-03-14 11:38) [33]

ilandrei © (13.03.03 21:02)
Угу, равносильно 5 + "Я", результат UNKNOWN



Страницы: 1 вся ветка

Текущий архив: 2003.04.03;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.021 c
3-6363
кондратий
2003-03-12 18:58
2003.04.03
Table, View--> DBF


1-6437
Alex-21
2003-03-14 20:14
2003.04.03
Активность окна


1-6463
Ильдар
2003-03-24 12:29
2003.04.03
Какие библиотеки нужны


1-6575
nick_k
2003-03-21 22:44
2003.04.03
Будет ли работать прога, откомпилированная в Delhi 6 под Win 3.1


7-6832
_MAD_
2003-02-07 21:33
2003.04.03
WebCam