Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

NVL в Interbase [IB6.x]


Страницы:   1 2

ilandrei ©   (2003-03-13 17:28:00) 

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


Anatoly Podgoretsky   (2003-03-14 11:38:00) [1]

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


myor   (2003-03-14 11:35:00) [2]

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


Dred2k   (2003-03-14 10:23:00) [3]

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

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


Sergey13   (2003-03-14 10:11:00) [4]

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


Dred2k   (2003-03-14 09:33:00) [5]

2 Johnmen

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


Johnmen   (2003-03-13 23:55:00) [6]

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

>zacho ©

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


zacho   (2003-03-13 23:20:00) [7]

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


Dred2k   (2003-03-13 23:11:00) [8]

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


Dred2k   (2003-03-13 23:07:00) [9]

2 zacho

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

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

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

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

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

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


zacho   (2003-03-13 22:51:00) [10]


> 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 21:54:00) [11]

2 zacho

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

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


zacho   (2003-03-13 21:38:00) [12]


> 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 - для тебя сейчас лучшее решение.


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

>Dred2k © (13.03.03 21:10)

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


Dred2k   (2003-03-13 21:10:00) [14]

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


ilandrei   (2003-03-13 21:02:00) [15]

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


Dred2k   (2003-03-13 20:49:00) [16]

2 zacho

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


zacho   (2003-03-13 20:32:00) [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ов.


Desdechado   (2003-03-13 19:37:00) [18]

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


ilandrei   (2003-03-13 18:08:00) [19]

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

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


Dred2k   (2003-03-13 18:06:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо