Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.04.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.014 c
3-6385
Наташа
2003-03-15 13:15
2003.04.03
Редактор полей


1-6514
Michael Makushev
2003-03-24 21:11
2003.04.03
Парсер (любой) как пользоваться ?


14-6723
vic_774N
2003-03-16 10:01
2003.04.03
Стоит ли трудиться ? ( Написание отладчика )


3-6357
SiJack
2003-03-14 12:22
2003.04.03
Как в DbGrid сделать отдельную колонку не редактируемой


14-6783
Карлсон
2003-03-17 17:37
2003.04.03
грустно.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский