![](/user_photo/_userpic.png)
- •Firebird Null Guide
- •Table of Contents
- •Introduction
- •What is NULL?
- •NULL in expressions
- •Expressions returning NULL
- •NULL in boolean expressions
- •More logic (or not)
- •NULL in aggregate functions
- •NULL handling in UDFs
- •NULL <-> non-NULL conversions you didn't ask for
- •Being prepared for undesired conversions
- •More on UDFs
- •NULL in if statements
- •Testing if something is NULL
- •Setting a field or variable to NULL
- •Dealing with NULLs
- •Testing for NULL - if it matters
- •Finding out if fields are the same
- •Finding out if a field has changed
- •Substituting NULL with a value
- •The COALESCE function
- •Firebird 1.0: the *NVL functions
- •Summary
- •Document history
- •License notice
![](/html/616/253/html_bmr_9PvgO9.lye5/htmlconvd-4dFcwY11x1.jpg)
Firebird Null Guide
If you only want something to be done if A and B are different, either use one of the correct expressions shown above and put a dummy statement in the then clause, or use this longer test expression:
/* This is a correct |
inequality test: */ |
||
if (A <> B |
|
|
|
or |
A is null and |
B is not |
null |
or |
A is not null |
and B is |
null) then... |
Finding out if a field has changed
In triggers, it's often useful to know if a certain field has changed (including: gone from NULL to non-NULL or vice versa) or stayed the same. This is nothing but a special case of testing the (in)equality of two fields. Just use New.Fieldname and Old.Fieldname for A and B:
if (New.Job = Old.Job or New.Job is null and Old.Job is null)
then ...Job field has stayed the same...
else ...Job field has changed...
Substituting NULL with a value
The COALESCE function
Firebird 1.5 has a function that can convert NULL to most anything else. This enables you to do an on- the-fly conversion and use the result in your further processing, without the need for “if (MyExpression is null) then” constructs. The function is called COALESCE and you call it like this:
COALESCE(Expr1, Expr2, Expr3, ...)
COALESCE returns 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, like in the “right to vote” example used previously, your only option is to go for “if (MyExpression is null) then” after all.
11
![](/html/616/253/html_bmr_9PvgO9.lye5/htmlconvd-4dFcwY12x1.jpg)
Firebird Null Guide
Firebird 1.0: the *NVL functions
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 *NVL functions take exactly two arguments. Like COALESCE, 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 functions - is only available for Windows.
12