Форум: "Базы";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
ВнизNVL для NUMERIC в FireBird Найти похожие ветки
← →
Sergey_Masloff (2005-12-06 17:38) [0]собственно, сабж. idNvl из fbudf по понятным причинам (не работает) не подходит. DIALECT3 FB1.x
Как кто решает трабл? Неужели никто не сталкивался? ;-)
← →
Johnmen © (2005-12-06 17:41) [1]
COALESCE
========
Syntax:
COALESCE (value {, value} ... )
Notes:
1. COALESCE (V1, V2) is equivalent to the following case specification:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
2. COALESCE (V1, V2, ..., Vn), for n >= 3, is equivalent to the following case specification:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END
3. The function has the same meaning as NVL one in Oracle.
← →
Sergey_Masloff (2005-12-06 17:53) [2]Это я знаю. В 1.0 нету
И мне не в селекте надо писать а в условиях ;-)
Всем переходить на 1.5 не предлагать - 2000 серверных установок половина у партнеров диктовать которым мы не можем. Нужно чтобы работало в FB 1.0
Нужно что-то вроде
IF (pEQ is null) THEN
BEGIN
FOR SELECT ISN, TARIFFISN, BASETARIFF, ADJUSTMENT, DISCOUNT,
TARIFF, FRANCHTARIFF, FRANCHSUM, FRANCHMAXSUM, ROUNDM,
OBJCLASSISN, RISKCLASSISN, X1, X2, X3,
X4, X5, DATEBEG, DATEEND, LIMCLASSISN,
FRANCHTYPE, CURRISN
FROM RULTARIFF t
WHERE TARIFFISN = :pTariffISN
AND (:pDate between DATEBEG and DATEEND)
AND DNVL2(X1,0) >= DNVL2(:p1,0)
AND DNVL2(X2,0) >= DNVL2(:p2,0)
AND DNVL2(X3,0) >= DNVL2(:p3,0)
AND DNVL2(X4,0) >= DNVL2(:p4,0)
AND DNVL2(X5,0) >= DNVL2(:p5,0)
← →
Desdechado © (2005-12-06 18:09) [3]если тебе NULL превращать в 0, то пишется UDF из 1 строчки
{ 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;
← →
Johnmen © (2005-12-06 18:25) [4]
> Sergey_Masloff (06.12.05 17:53) [2]
Ну здесь несложно добавить в WHERE проверки (x is nul)
(Учитывая, что логическое выражение вычисляется справа налево по короткой схеме по умолчанию)
← →
Sergey Masloff (2005-12-06 20:13) [5]Desdechado © (06.12.05 18:09) [3]
Мне не надо INTEGER. Мне надо DOUBLE. Нет в FB1 средств проверить для DOUBLE NULL он или нет. Просто не передается эта информация. Что-то я читал что в 2.0 добавят что-то на эту тему
А мне не в 0 превращать а в разное в том числе и в результаты выражений и в селектах и др.
Просто я портировал немаленький проект с Оракла и хочется максимально близкий внешне код иметь так как это нужно параллельно развивать. А кода много сотен тысяч строк. Конечно где можно я напишу if (x is null) then но это громоздко и лень и вообще хотелось чего-то красивого и универсального. UDF со строками я написал, с датами написал осталось DOUBLE но долгие поиски ничего не дали.
← →
Виталий Панасенко (2005-12-07 09:04) [6]
> Desdechado © (06.12.05 18:09) [3]
> Мне не надо INTEGER. Мне надо DOUBLE. Нет в FB1 средств
> проверить для DOUBLE NULL он или нет. Просто не передается
> эта информация. Что-то я читал что в 2.0 добавят что-то
> на эту тему
Поменяй Integer на DOUBLE.. Что мешает ? Это реализовано в rFunc(UDF)
http://polesoft.da.ru
← →
Sergey_Masloff (2005-12-07 09:22) [7]Виталий Панасенко (07.12.05 09:04) [6]
это НЕ реализовано в rFunc. Вернее, "реализовано" но не работает
← →
Виталий Панасенко (2005-12-07 09:59) [8]Странно, у меня работает... Сервер, правда 1.5, но диалект 3... Функция Z.. сорри, как всегда, не дочитал.. Тебе не в 0 нужно превращать?...Хотя функция Я как раз это и делает.. Если NULL, то 0, иначе - исходное значение...
Версия 1.3.0 12.11.99
------------
1. Добавлены функции:
Z - обнуление пустого значения
dif, iif, cif - реализация iif с разными типами параметров
DZero - деление со значением по-умолчанию
← →
Виталий Панасенко (2005-12-07 10:15) [9]select * from table where z(f1)=0 очень даже работоспособно...
аналогично select * from table where f1 is null
← →
Виталий Панасенко (2005-12-07 10:33) [10]http://www.ibase.ru/ibo/n10.htm - ниже цитата по этой ссылке
tbudf.zip - Tony Caduto подготовил вариант fbudf для компиляции в Delphi или Kylix. Если кто не помнит, то эта библиотека содержит универсальные функции, которые принимают и передают параметры новым способом by descriptor (способ на самом деле старый, существовал в IB до версий 4.0, потом чуть не был вычищен из кода). Таким образом в UDF можно передавать и возвращать значения null, а так же декларировать одну и ту же функцию для обработки разных типов данных, если код функции обрабатывает эту ситуацию. Типичным примером является функция idNvl, которая может быть объявлена как declare external function с параметрами int, numeric(18,0), double precision. Посмотрите внимательно исходный код функций, и их объявление (tbudf.sql).
Внимание - данную библиотеку, как и fbudf, можно использовать только с Firebird 1.0 или последними версиями Yaffil. С Interbase она работать не будет.
← →
Sergey_Masloff (2005-12-07 10:43) [11]Виталий Панасенко (07.12.05 09:59) [8]
см. пример в [2] там правда тоже не совсем корректно - везде нули это не всегда так. Тем более я хочу и в селектах и в условиях и вообще в выражениях в процедурах одну функцию использовать. Поэтому rfunc тоже не подходит. Да и вообще боюсь ничего не подходит так по дескриптору для double нет флага NULL то есть 0 от нуля не отличить.
← →
Sergey_Masloff (2005-12-07 10:46) [12]Виталий Панасенко (07.12.05 10:33) [10]
Нет это я исследовал - не работает 100%. То ли глюк то ли что - для TIMESTAMP скажем флаг NULL передается и все прекрасно работает.
клонирую свой пример с IBASE.RU
create table test_t (id integer nut null, x1 numeric(18,4), x2 numeric(18,4), primary key (id));
insert into test_t(id, x1, x2) values (1, 5, 10);
insert into test_t(id, x1, x2) values (2, NULL, 10);
insert into test_t(id, x1, x2) values (3, 5, NULL);
select x1, dnvl(x1,0) as xx1, x2, dnvl(x2,0) as xx2 from test_t
dnvl из tbudf
← →
Виталий Панасенко (2005-12-07 15:12) [13]
> то есть 0 от нуля не отличить.
А зачем это нужно ? Судя из условий, ты хочешь с конкретным значение сравнивать... Может, я гоню, конечно.. Но приведи NULL к 0 и с ним уже сравнивай.. Да, гонит для NULL dnvl... Более подробно можно ?
← →
Sergey_Masloff (2005-12-07 15:19) [14]Нет не могу приводить. 0 это 0 а NULL это совсем другое ;-)
То что я привел это только очень маленькая часть того что я хочу использовать (точнее использую уже много лет - но в Oracle). Могу конечно переписать большинство с другой логикой но тогда теряется весь смысл - я не в состоянии буду поддерживать параллельные изменения в разумные промежутки времени :((
На Ibase говорят а не фиг NULL в числовых полях использовать ;-)
← →
Виталий Панасенко (2005-12-07 15:24) [15]
> На Ibase говорят а не фиг NULL в числовых полях использовать
> ;-)
Слышал когда-то такое (похожее) высказываени.. может, оно и так...:-)) Но тебе от этого не легче.. явно..:-)))) Мои познания the end...:-))) Конечно, решаемо на 1,5.. но.. партнеры у вас вредные.. какой им в .. разница ?:-)))
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c