| Firebird Documentation Index → Firebird Null Guide → Converting to and from NULL |
![]() |
The COALESCE function in Firebird 1.5 and higher can convert
NULL to most anything else. This enables you to perform an on-the-fly
conversion and use the result in your further processing, without the need for
“if (MyExpression is null) then” or similar constructions.
The function signature is:
COALESCE( Expr1, Expr2, Expr3, ... )
COALESCE returns the value of the first
non-NULL expression in the argument list. If all the expressions are
NULL, it returns NULL.
This is how you would use COALESCE to construct a person's full
name from the first, middle and last names, assuming that some middle name fields may be
NULL:
select FirstName
|| coalesce( ' ' || MiddleName, '' )
|| ' ' || LastName
from Persons
Or, to create an as-informal-as-possible name from a table that also includes
nicknames, and assuming that both nickname and first name may be
NULL:
select coalesce ( Nickname, FirstName, 'Mr./Mrs.' )
|| ' ' || LastName
from OtherPersons
COALESCE will only help you out in situations where
NULL can be treated in the same way as some allowed value for the
datatype. If NULL needs special handling, different from any other
value, your only option is to use an IF or CASE
construct after all.
Firebird 1.0 doesn't have COALESCE. However, you can use four
UDFs that provide a good part of its functionality. These UDFs reside in the fbudf lib and they are:
iNVL, for integer arguments
i64NVL, for bigint arguments
dNVL, for double precision arguments
sNVL, for strings
The functions take exactly two
arguments. Like *NVLCOALESCE, they return the first argument if it's not
NULL; otherwise, they return the second. Please note that the Firebird
1.0 fbudf lib – and therefore, the
*NVL function set – is only available for Windows.
Sometimes you want certain values to show up as NULL in the output
(or intermediate output). This doesn't happen often, but it may for instance be useful if you
want to exclude certain values from summing or averaging. The NULLIF
functions can do this for you, though only for one value at the time.
The NULLIF internal function takes two arguments. If their values are equal, the
function returns NULL. Otherwise, it returns the value of the first
argument.
A typical use is e.g.
select avg( nullif( Weight, -1 ) ) from FatPeople
which will give you the average weight of the FatPeople population, without counting
those with weight -1. (Remember that aggregate functions like AVG
exclude all NULL fields from the computation.)
Elaborating on this example, suppose that until now you have used the value -1 to
indicate “weight unknown” because you weren't comfortable with
NULLs. After reading this guide, you may feel brave enough to give the
command:
update FatPeople set Weight = nullif( Weight, -1 )
Now unknown weights will really be unknown.
Firebird 1.0.x doesn't have the NULLIF internal function.
Instead, it has four user-defined functions in the fbudf lib that serve the same purpose:
inullif, for integer arguments
i64nullif, for bigint arguments
dnullif, for double precision arguments
snullif, for strings
Please note that the Firebird 1.0 fbudf lib –
and therefore, the *nullif function set – is only available for
Windows.
The Firebird 1 Release Notes state that, because of an engine limitation, these UDFs
return a zero-equivalent if the arguments are equal. This is incorrect: if the arguments
have the same value, the functions all return a true NULL.
However – they also return NULL if the first argument is a real
value and the second argument is NULL. This is a wrong result. The
Firebird 1.5 internal NULLIF function correctly returns the first
argument in such a case.
| Firebird Documentation Index → Firebird Null Guide → Converting to and from NULL |