Текущий архив: 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.53 MB
Время: 0.01 c