![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]
> можно ли подставить
Можно.
Только сначала определись, где ты хочешь реализовать подстановку - на стороне сервера или на стороне клиента.