Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.015 c
2-1137704176
kizam
2006-01-19 23:56
2006.02.05
такая ошыбка


1-1135970052
Allegarh
2005-12-30 22:14
2006.02.05
Поддержка нескольких языков в программе


15-1136568903
Джо
2006-01-06 20:35
2006.02.05
MS-DOS Executive, файловый менеджер времен Windows 1.0


6-1130739723
denissoft
2005-10-31 09:22
2006.02.05
то значит символы D0 и D1-?


15-1137406269
Александр__
2006-01-16 13:11
2006.02.05
Углубленное знание чего то одного или базовое многого?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский