Post by MorffPost by miabA co to za dziadowstowo co to zamiast null'a daje pustego stringa?
Null jest null w porządnych implementacjach zaś pustyn string
pusty string.
a oracle na ten przykład ...
Co Oracle na ten przykład?
Podejrzewam że to samo:
<cy>
Wartości puste
Pola tabeli mogą przyjmować wartości puste, pod warunkiem, że nie zostało to
zabronione przez projektanta bazy danych. Wartość pusta (NULL) nie jest
równa wartości 0 i w wyniku obliczenia dowolnego wyrażenia, którego
argumentem jest NULL otrzymuje się również wartość pustą (NULL).
Funkcja NVL pozwala dokonać konwersji wartości aktualnej (do niej samej) lub
wartości pustej do wartości domyślnej. Działanie funkcji NVL ilustruje
przykład:
NVL(COMM, 0) zwróci wartość COMM, jesli nie jest to wartość pusta lub 0
jeśli COMM ma wartość NULL.
Większość funkcji grupujących ignoruje wartość NULL. Np. zapytanie, którego
zadaniem jest obliczenie średniej z pięciu następujących wartości: 1000,
NULL, NULL, NULL i 2000 zwróci 1500 ponieważ (1000 + 2000)/2 = 1500.
Jedyne operatory porównania, które można użyć do wartości pustej to IS NULL
i IS NOT NULL. Jeśli zostanie użyty jakikolwiek inny operator porównania do
wartości pustej, to wynik jest nieokreślony. Ponieważ NULL reprezentuje brak
wartości, więc nie może on być równy ani nierówny jakiejkolwiek innej
wartości, również innemu NULL.
ORACLE traktuje warunki, których wynik jest nieznany jako fałszywe. Tak więc
warunek COMM = NULL jest nieznany, w związku z czym rozkaz SELECT z takim
warunkiem nie zwróci nigdy żadnego wiersza. Jednak w takiej sytuacji ORACLE
nie zgłosi informacji o wystąpieniu błędu.
</cy>
http://galaxy.uci.agh.edu.pl/~chwastek/lectures/db/dbnull.html
A co do rozwiązania problemu z InterBase to możan użyć fbudf.dll z
FireBird1/1.5
który ma podobne funkcje co Oracle:
<cy>
--FBUDF_API paramdsc* idNvl(paramdsc* v, paramdsc* v2)
declare external function invl
int by descriptor, int by descriptor
returns int by descriptor
entry_point 'idNvl' module_name 'fbudf';
--FBUDF_API paramdsc* idNvl(paramdsc* v, paramdsc* v2)
declare external function i64nvl
numeric(18,0) by descriptor, numeric(18,0) by descriptor
returns numeric(18,0) by descriptor
entry_point 'idNvl' module_name 'fbudf';
--FBUDF_API paramdsc* idNvl(paramdsc* v, paramdsc* v2)
declare external function dnvl
double precision by descriptor, double precision by descriptor
returns double precision by descriptor
entry_point 'idNvl' module_name 'fbudf';
--FBUDF_API paramdsc* sNvl(paramdsc* v, paramdsc* v2, paramdsc* rc)
declare external function snvl
varchar(100) by descriptor, varchar(100) by descriptor,
varchar(100) by descriptor returns parameter 3
entry_point 'sNvl' module_name 'fbudf';
--FBUDF_API paramdsc* iNullIf(paramdsc* v, paramdsc* v2)
declare external function inullif
int by descriptor, int by descriptor
returns int by descriptor
entry_point 'iNullIf' module_name 'fbudf';
--FBUDF_API paramdsc* dNullIf(paramdsc* v, paramdsc* v2)
declare external function dnullif
double precision by descriptor, double precision by descriptor
returns double precision by descriptor
entry_point 'dNullIf' module_name 'fbudf';
--FBUDF_API paramdsc* iNullIf(paramdsc* v, paramdsc* v2)
declare external function i64nullif
numeric(18,4) by descriptor, numeric(18,4) by descriptor
returns numeric(18,4) by descriptor
entry_point 'iNullIf' module_name 'fbudf';
--FBUDF_API paramdsc* sNullIf(paramdsc* v, paramdsc* v2, paramdsc* rc)
declare external function snullif
varchar(100) by descriptor, varchar(100) by descriptor,
varchar(100) by descriptor returns parameter 3
entry_point 'sNullIf' module_name 'fbudf';
</cy>
Które w FireBird1.5.x.yyyy są niepotrzebne ale zachowano dla
kompatybilności:
<cy>
The *NVL and *NULLIF functions remain for backward compatibility, but are
deprecated by the introduction of the new internal functions CASE, COALESCE
and NULLIF.
</cy>
http://www.ibexpert.info/firebird/documentation/Firebird%20Release%20Notes%20v1.5/External%20Functions%20(UDFs)/In%20fbudf/18507.html
miab