Writing Comparisons Involving NULL in Programs
Problem
You’re writing a program
that issues a query, but it fails for NULL values.
Solution
Try writing the comparison selectively for NULL
and non-NULL values.
Discussion
The need to use different comparison operators for
NULL values than for non-NULL
values leads to a subtle danger when constructing query strings
within programs. If you have a value stored in a variable that might
represent a NULL value, you must account for that
if you use the value in comparisons. For example, in Perl,
undef represents a NULL value,
so to construct a statement that finds records in the
taxpayer table matching some arbitrary value in an
$id variable, you cannot do this:
$sth = $dbh->prepare ("SELECT * FROM taxpayer WHERE id = ?");
$sth->execute ($id);The statement fails when $id is
undef, because the resulting query becomes:
SELECT * FROM taxpayer WHERE id = NULL
That statement returns no records—a comparison of
= NULL always fails. To take
into account the possibility that $id may be
undef, construct the query using the appropriate
comparison operator like this:
$operator = (defined ($id) ? "=" : "IS");
$sth = $dbh->prepare ("SELECT * FROM taxpayer WHERE id $operator ?");
$sth->execute ($id);This results in queries as follows for $id values
of undef (NULL) or 43 (not
NULL):
SELECT * FROM taxpayer WHERE id IS NULL SELECT * FROM taxpayer WHERE id = 43
For inequality tests, set $operator like this
instead:
$operator = (defined ($id) ? "!=" : "IS NOT"); ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access