Форум: "Базы";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Внизnull+integer Найти похожие ветки
← →
Daiz13 (2002-07-22 11:10) [0]К одной из колонок выборки добавляеться результат другого SELECT. Проблема в том что если эта "другая" выборка возвращает null то в итоге получаем null, хотя TOTALENERGY и больше нуля.
SELECT M.DAYTIME, M.TOTALENERGY, CAST((SELECT sum(COUNTERA) FROM TCOR WHERE daytime<=M.DAYTIME ) AS INTEGER)+M.TOTALENERGY as cor
FROM measures M
Как к null прибавить integer и получить integer?
← →
Val (2002-07-22 11:36) [1]операция с null дает null и это правильно. Для оперирования с числами нужно этот null преобразовывать в 0.
← →
oss (2002-07-22 13:13) [2]попробуй CONCAT
← →
kaif (2002-07-22 14:14) [3]Боюсь, придется хранимую процедуру писать с FOR SELECT... И перед каждым SUSPEND делать проверку
IF (SUM_COUNTERA IS NULL) и возвращать в этом случае TOTALENERGY.
По скорости не потеряешь.
← →
Lord Warlock (2002-07-22 14:16) [4]Операция преобразования в LocalSQL - CAST
← →
Val (2002-07-22 14:28) [5]неплохо было бы, по-моему, написать функцию типа оракловской nvl, в которую передают два параметра, имя поля и значение. Она проверяет данное поле на null и в случае положительного результата, возвращает второй, переданный ей аргумент, т.е. заменяет null им.
Тогда все выглядело бы так:
SELECT M.DAYTIME, M.TOTALENERGY, CAST((SELECT sum(nvl(COUNTERA,0)) FROM TCOR WHERE daytime<=M.DAYTIME ) AS INTEGER)+M.TOTALENERGY as cor
FROM measures M
← →
Ciklon (2002-07-23 22:20) [6]Можно воспользоваться библиотекой UDF rFunc.dll
В ней приличное количество полезных функций, в том числе имеется функция Z - для проверки входного параметра на NULL и выводе в этом случае значения "0", если входной параметр отличен от NULL, то он передается на выход без изменения.
← →
IlyaA (2002-07-24 08:17) [7]У меня вчера возникла та-же проблема. Я создал процедуры, которые возвр. нужное значение, а если такой записи нет то 0; и вид с использованием ентих процедур.
Вот что у меня получилось:
CREATE PROCEDURE GET_SELL_CNT (
ITOVAR INTEGER
) RETURNS (
T_CNT INTEGER
) AS
BEGIN
Select cnt From Sell_Tovar Where Tovar_No = :iTovar into :T_Cnt;
if ( :T_Cnt > 0 ) then
Suspend;
else
begin
T_Cnt = 0;
Suspend;
end
END
CREATE PROCEDURE GET_SELL_WES (
ITOVAR INTEGER
) RETURNS (
T_WES FLOAT
) AS
BEGIN
Select Wes From Sell_Tovar Where Tovar_No = :iTovar into :T_Wes;
if ( :T_Wes > 0 ) then
Suspend;
else
begin
T_Wes = 0;
Suspend;
end
END
Это процедуры. Их вид почти одинаков.
CREATE VIEW OSTATKI (
ID,
PO,
PF,
ARTIKUL,
NAME,
PROBA,
TOV_SIZE,
TOVAR_GROUP,
IZGOTOV_NAME,
OST_WES,
OST_CNT,
EI_ID,
EI
) AS
Select Fakt_Tovar.ID as ID, Fakt_Tovar.Price_Otpusk as PO, Fakt_Tovar.Price_Free as PF,
A.Artikul as Artikul, A.Name as Name,
A.Proba as Proba, A.Tov_Size as Tov_Size,
TG.Name as Tovar_Group, I.Name as Izgotov_Name,
( Fakt_Tovar.Wes - (Select Sum(T_Wes) from Get_Sell_Wes( Fakt_Tovar.ID )) ) as Ost_Wes,
( Fakt_Tovar.Tovar_Count - (Select Sum(T_Cnt) from Get_Sell_Cnt( Fakt_Tovar.ID )) ) as Ost_Cnt,
EdI.ID as EI_ID, EdI.Name as EI
From Fakt_Tovar FT, Artikuls A, Tovar_Group TG, Izgotov I, Ed_Izmer EdI
Where ( FT.ARTIKUL_NO = A.ID ) and ( A.Group_No = TG.ID ) and ( A.Izgotov = I.ID ) and
( A.Ed_Izm = EdI.ID )
А это Вид, в котором используются данные процедуры. Вроде всё работает как надо.
Может что-то здесь лучше можно сделать? Заранее спасибо.
← →
Val (2002-07-24 10:42) [8]а если тип строка, к примеру?
← →
IlyaA (2002-07-24 14:23) [9]Тогда в хранимых проц-х надо проверять не на >0 а на Null
← →
Val (2002-07-24 16:49) [10]не о том. просто на PL можно написать процедурки перегружаемые, т.е. имя у них одно и то же, а тип параметров разный, вызывай себе для любого типа, для которого реализовал. Но если в IB так не получится, придется давать разные имена, но это не проблема, я думаю, приделать префикс удобный и все.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c