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

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

null на 0 [D7, IB6.x]


rosl ©   (2007-08-07 04:47:00) 

подскажите.
такой запрос:
select  d.NAME, sum(n.SUMMA_NACH), sum(o.SUMMA), (sum(n.SUMMA_NACH) - sum(o.SUMMA))
from SPR_DOGOVORS d LEFT JOIN OPL o on DOGOVOR = d.ID_KEY, NACH n  
where n.SHET = d.ID_KEY

group by d.NAME

но в таблице OPL не всегда есть значение, поэтому получаем примерно следущее:

NAME       SUM    SUM1     F1
иванов      10         5        5
петров      10

так вот, мне нужно, чтоб результат F1 был ВСЕГДА
можно ли подставить 0 в поле SUM1, если там значение NULL?


iXT   (2007-08-08 09:44:00) [1]

ИМХО 0 <> null, ибо "отсутствие результата - тоже результат" (С). Менять на стороне сервера запрещено. На клиенте отображать хоть штрих-кодом.


Johnmen   (2007-08-08 01:09:00) [2]


> palva ©   (08.08.07 00:54) [15]

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


palva   (2007-08-08 00:54:00) [3]

> И как-то же обходились, не правда ли?
Чистая правда. И без баз данных обходились. И считали всё на клиенте. И оптимизацию проводили вручную.
Я согласен быть тупым ламером, но мозговые усилия все же предпочитаю экономить. Пусть за меня будет думать SQL-сервер, а мое дело вовремя написать coalesce.


Johnmen   (2007-08-08 00:18:00) [4]


> palva ©   (07.08.07 23:44) [13]
> Помогите автору, если у вас есть решение.

Различные решения существуют много лет, ещё с тех давних пор, когда уже были базы данных, программирование и SQL, но ещё не было данной ф-ии. И как-то же обходились, не правда ли?
А самое банальное решение (да и не решение, ибо сабж - это не задача) - не считать в запросе разность. Считать её на клиенте.
Кстати, и автор зачем-то два раза выполняет одно и то же суммирование...


palva   (2007-08-07 23:44:00) [5]

Johnmen ©   (07.08.07 23:27) [12]
Эта функция нужна, как правило, тем, кто не хочет думать.


Да я вроде пытался подумать. Но ничего не придумал. Помогите автору, если у вас есть решение.


Johnmen   (2007-08-07 23:27:00) [6]


> palva ©   (07.08.07 22:44) [11]
> > нет. не проходит. function unknown coalesceИнтересно,
> сколько денег заплачено за такой InterBase без coalesce.

Эта функция нужна, как правило, тем, кто не хочет думать.


palva   (2007-08-07 22:44:00) [7]

> нет. не проходит. function unknown coalesce
Интересно, сколько денег заплачено за такой InterBase без coalesce. А африканские дети голодают...


Desdechado   (2007-08-07 20:29:00) [8]

Написать UDF.
{----- заменить null на целый ноль -----}
{ DECLARE EXTERNAL FUNCTION NullInt
         INTEGER
         RETURNS INTEGER BY VALUE
         ENTRY_POINT "fn_NullInt" MODULE_NAME "ib_fv";
}
function fn_NullInt( var n: Integer ): Integer; cdecl; export;
begin
 result := n;
end;


rosl   (2007-08-07 16:26:00) [9]


> select sum(s1), coalesce(sum(s2), 0) from table1

нет. не проходит. function unknown coalesce


palva   (2007-08-07 15:10:00) [10]

А функция coalesce у вас имеется?
select sum(s1), coalesce(sum(s2), 0) from table1


Сергей М.   (2007-08-07 14:35:00) [11]

см. TField.OnGetText


rosl   (2007-08-07 14:32:00) [12]


> А тебе нужно иметь 0 вместо Null именно в НД или достаточно
> видеть этот "0", например, в гриде, отображающем этот НД
> ?

мне нужно отобразить только суммы, которые больше 1000. но т.к. в некоторых строках поля SUM1 NULL, то соответственно результат F1 тоже NULL, хотя там должена стоять 1000


> select sum(s1), case when sum(s2) is null then 0 else sum(s2)
> end from table1

не прокатила... у меня IB7. ругается на when. говорит - token unknown


Asail   (2007-08-07 14:17:00) [13]

В IB 6.x такое не проканает (в более поздних не уверен). Можно написать UDF-функцию..


palva   (2007-08-07 11:41:00) [14]

В FireBird 1.5 работает такая конструкция

select sum(s1), case when sum(s2) is null then 0 else sum(s2) end from table1

Может быть в IB такое прокатит?


Сергей М.   (2007-08-07 10:31:00) [15]

А тебе нужно иметь 0 вместо Null именно в НД или достаточно видеть этот "0", например, в гриде, отображающем этот НД ?


rosl   (2007-08-07 10:26:00) [16]

лучше клиента.
но можно и сервера. как реализовать? натолкните на мысль...


Сергей М.   (2007-08-07 09:27:00) [17]


> можно ли подставить


Можно.

Только сначала определись, где ты хочешь реализовать подстановку - на стороне  сервера или на стороне клиента.


Наверх

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