Null handling
SQream DB handles NULL values similar to other RDBMSs, with some minor differences.
Tip
When using sqream sql NULL values are displayed as \N. Different clients may show other values, including an empty string.
Comparisons
Any comparison between a NULL and a value will result in NULL.
For example, writing WHERE a = NULL will never match to TRUE or FALSE, because the comparison results in NULL. Use IS NULL to check for NULL values in result sets.
Conditionals
Functions like ISNULL and COALESCE evaluate arguments in their given order, so they may never evaluate some arguments.
For example, COALESCE(a,b,c,d,NULL) will never evalulate b, c, d, or NULL if a is not NULL.
Operations
Scalar functions
With all scalar functions, a NULL input to any one of the arguments means the result is NULL.
t=> SELECT x, y, z, x+y as "x+y", x*y as "x*y", y*z as "y*z", z-y as "z-y" FROM n;
x | y | z | x+y | x*y | y*z | z-y
--+----+----+-----+-----+-----+----
1 | 0 | 1 | 1 | 0 | 0 | 1
2 | 1 | 1 | 3 | 2 | 1 | 0
3 | \N | 4 | \N | \N | \N | \N
4 | \N | \N | \N | \N | \N | \N
5 | 6 | \N | 11 | 30 | \N | \N
Aggregates
With aggregates, NULL values are ignored, so they do not affect the result set.
t=> SELECT SUM(x) AS "sum(x)", SUM(y) AS "sum(y)", SUM(z) AS "sum(z)" FROM n;
sum(x) | sum(y) | sum(z)
-------+--------+-------
15 | 7 | 6
t=> SELECT COUNT(x) AS "count(x)", COUNT(y) AS "count(y)", COUNT(z) AS "count(z)" FROM n;
count(x) | count(y) | count(z)
---------+----------+---------
5 | 3 | 3
Distincts
NULL values are considered distinct, but only counted once.
t=> SELECT DISTINCT z FROM n;
z
--
1
4
\N
Running COUNT DISTINCT however, ignores the NULL values:
NULL values are considered distinct, but only counted once.
t=> SELECT COUNT(DISTINCT z) FROM n;
count
-----
2
Sorting
When sorting a column containing NULL values, SQream DB sorts NULL values first with ASC and last with DESC.
SQream DB does not implement NULLS FIRST or NULLS LAST, so where NULL appears cannot change where NULL values appear in the sort order.
t=> SELECT * FROM n ORDER BY z ASC;
x | y | z
--+----+---
4 | \N | \N
5 | 6 | \N
1 | 0 | 1
2 | 1 | 1
3 | \N | 4
t=> SELECT * FROM n ORDER BY z DESC;
x | y | z
--+----+---
3 | \N | 4
1 | 0 | 1
2 | 1 | 1
4 | \N | \N
5 | 6 | \N