MUCH ADO ABOUT NOTHING Walter Schenk SoluTech Consulting Services Inc AGENDA What it is and what is not NULL in functions, expressions, comparisons and conditional control
Download
Report
Transcript MUCH ADO ABOUT NOTHING Walter Schenk SoluTech Consulting Services Inc AGENDA What it is and what is not NULL in functions, expressions, comparisons and conditional control
MUCH ADO ABOUT
NOTHING
Walter
Schenk
SoluTech Consulting Services Inc
AGENDA
What it is and what is not
NULL in functions, expressions,
comparisons and conditional control
NULL in Indexes
NULL in programming languages
WHAT A NULL IS NOT!
A NULL is NOT 0!
A NULL is NOT Nothing!
A NULL is NOT an empty string (although
Oracle does treat it as such but that may
change in the future!)
THEN WHAT IS A NULL?
When a column in a row has no value
The value is not known or meaningful
WHY DO WE NEED NULL
VALUES?
Often real-world information is incomplete
It is a way of handling this unknown
NULL IN FUNCTIONS
“Normal” scalar functions will return NULL when
given a NULL argument
All aggregate functions except COUNT(*) and
GROUPING ignore nulls.
You can use the NVL in the argument to an
aggregate function to substitute a value for a null.
If a query with an aggregate function returns no
rows or only rows with nulls for the argument to
the aggregate function, the aggregate function
returns null.
FUNCTIONS THAT HANDLE
NULLS
– NVL
– CONCAT
– REPLACE
– NULLIF (9i)
– COALESCE (9i)
– DECODE
NVL
NVL ( expr1 , expr2 )
If expr1 is null, returns expr2; if expr1 is not null,
returns expr1.
Can be any datatype
CONCAT
CONCAT ( char1 , char2 )
SELECT CONCAT(‘job’,NULL) "Job"
FROM DUAL;
Job
----------------job
Returns char1 concatenated with char2.
REPLACE
REPLACE ( char , search_string, replacement_string)
Returns char with every occurrence of
search_string replaced with
replacement_string.
If replacement_string is omitted or null, all
occurrences of search_string are removed.
If search_string is null, char is returned.
REPLACE
SELECT REPLACE(‘Hello there’,’l’,NULL) "Chan
FROM DUAL;
Changes
-------------Heo there
SELECT REPLACE(‘Hello there’,NULL,’xxx’) "Ch
FROM DUAL;
Changes
-------------Hello there
NULLIF
A := NULLIF(B,C);
If the values match, then the result is NULL
COALESCE
COALESCE (expr1, expr2, ..., expr n
COALESCE returns the first non-null expr in
the expression list.
At least one expr must not be the literal NULL. If
all occurrences of expr evaluate to null, then the
function returns null.
DECODE
NULL = NULL !!!!
DECODE (deptno, 10, ’ACCOUNTING’,
20, ’RESEARC
30, ’SALES’,
NULL, ’OPERA
’NONE’)
NULLS AND COMPARISONS
Only compare NULLs with IS NULL or IS
NOT NULL
Use of any other operator and the result will
be NULL!
NULL <> NULL (except in the DECODE
expression and compound keys)
NULLS IN CONDITIONS
Always use: variable IS NULL
Never user: variable = NULL
NULLS IN LOGICAL
EXPRESSIONS
x
TRUE
TRUE
TRUE
FALSE
FALSE
FALSE
NULL
NULL
NULL
y
TRUE
FALSE
NULL
TRUE
FALSE
TRUE
TRUE
FALSE
NULL
x AND y
TRUE
FALSE
NULL
FALSE
FALSE
FALSE
NULL
FALSE
NULL
x OR y
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
TRUE
NULL
NULL
NOT x
FALSE
FALSE
FALSE
TRUE
TRUE
TRUE
NULL
NULL
NULL
HANDLING NULLS
Avoid common mistakes by keeping the
following in mind:
– Comparisons involving NULLs always yield
NULL
– Applying the logical operator NOT to a NULL
yields NULL
– In conditional control statements, if the
condition yields NULL, its associated sequence
of statements is NOT executed!
NULL AND CONDITIONAL
CONTROL
MOST COMMON MISTAKE:
In conditional control statements, if the
condition yields NULL, its associated
sequence of statements is NOT executed!
NULL AND CONDITIONAL
CONTROL
IF x > y THEN
high := x;
ELSE
high := y;
END IF;
IF NOT x > y THEN
high := Y;
ELSE
high := x;
END IF;
PROGRAMMING GUIDELINE
Always account for NULL in applications
even if the underlying database objects are
defined as NOT NULL.
NULL AND INDEX ENTRIES
Oracle does NOT enter an index value if the
ENTIRE key is NULL
Consequences:
– An index can NOT be used in a search criteria
for NULL values
– A UNIQUE constraint on a column that can be
NULL will allow multiple NULL values
NULLS IN PROGRAMMING
LANGUAGES
PL/SQL
C/C++
VB.NET and C#.NET
PL/SQL
Full support of NULL
C/C++
C/C++ does NOT support NULL
Variables are passed on to a C/C++
application through host variables for both
input as well as output
Host variables are prefixed with a colon
(“:”) to set them apart from Oracle objects
C/C++
Any host variable can be associated with an
indicator variable
An indicator variable is a short integer
variable that indicates the condition of its
host variable
C/C++ host variable on Input
If indicator variable = –1 then the variable
is a NULL and Oracle ignores the value of
the host variable
If indicator variable >=0 Oracle will assign
the value of the host variable to the column
C/C++ host variable on Output
If indicator variable = -1 then the column is
NULL and the value of the host variable is
indeterminate
If indicator variable = 0 then value of the
host variable is assigned
C/C++
EXEC SQL SELECT SAL, COMM
INTO :salary,:commission:ind_com
FROM EMP
WHERE EMPNO = :emp_number;
if (ind_comm == -1)
pay = salary
else
pay=salary + commission;
C/C++
Set ind_comm = -1;
EXEC SQL INSERT INTO emp (empno,comm)
VALUES (:emp_number,:commision:ind_comm);
VB
In VB6 only Variant data types could
support NULL
The NULL keyword indicated that a
variable contained the NULL value
The IsNull function was used to test for
NULL
VB.NET
During a migration from VB6 to VB.NET:
– Null is converted to DBNull
– IsNull is converted to IsDBNull
– The Variant data type is converted to Object
In VB6 Null could be used in functions and
assignments; DBNull cannot!
Consider using the Nothing keyword in
.NET instead of Null.
VB.NET IsDBNull function
Returns TRUE if the expression evaluates to the
DBNull type; otherwise returns FALSE
The System.DBNull value indicates that the object
represents missing or nonexistent data
It is NOT the same as Nothing which indicates
that a variable has not yet been initialized
VB.NET DBNull class
The DBNull class is used to indicate the
absence of a known value
The class differentiates between a null value
and an uninitialized value
PROGRAMMING GUIDELINE
Do not circumvent the use of NULLs by
assigning “meaningless” or “out-of-range”
values
Example: a column “EndDate” is often
assigned a far fetched date in the future to
avoid use of NULL
SQL STANDARDS AND
NULLS
FIPS 127-2 (1993)
The following features have "preliminary" syntax and semantics
available in Working Draft form as part of an on-going ANSI and
ISO/IEC standardization effort for further development of the SQL
language. Features specified in preliminary form include:
17. Multiple null states. A facility that allows user definitions for an
arbitrary number of application specific Null values, such as
"Unknown", "Missing", "Not Applicable", "Pending", etc. Each such
Null value would have a different representation in the database so
that they could be distinguished during retrieval or update.
SQL STANDARDS AND
NULLS
FIPS 193-7 (1995)
If an SQL/ERI Server implementation at the Minimal SDL level or below
chooses not to provide support for null values (see item 4 of Section 4.1), then
it may raise an implementation-defined exception in any SQL statement that
attempts to process null values.
If an SQL/ERI Server implementation at the Minimal SDL level or below
chooses not to provide support for null values (see item 4 of Section 4.1), then
it shall provide an implementation-defined conversion of would-be null values
in Information Schema tables to an appropriate non-null value.
If an SQL/ERI Server implementation at the Minimal SDL level or below
chooses not to provide support for null values (see item 4 of Section 4.1), then
it may raise an implementation- defined exception in any SQL statement that
attempts to process null values.
SQL STANDARDS AND
NULLS
The concept of NULL is subject to change!
Various implementations may vary.
DEPARTING WORDS
Never ignore NULL
Use NULL properly
QUESTIONS?
NoCOUG, February 20, 2003