Is there an easy way to skip NULL rows in union? I am on DB2.
Example:
SELECT 'FIRST', sum(value) FROM SYSIBM.SYSDUMMY1
UNION
SELECT 'SECOND', sum(value) FROM SYSIBM.SYSDUMMY1
UNION
SELECT 'THIRD', sum(value) FROM SYSIBM.SYSDUMMY1
result:
1---------|2-----
FIRST 1
SECOND NULL/0
THIRD 3
So, if one of the unions has 0 or NULL it should be skipped:
Estimated example result:
1---------|2-----
FIRST 1
THIRD 3
Use a subquery. I would also suggest union all
:
SELECT col, val
FROM (SELECT 'FIRST' as col, sum(value) as val FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT 'SECOND' as col, sum(value) as val FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT 'THIRD' as col, sum(value) as val FROM SYSIBM.SYSDUMMY1
) t
WHERE val IS NOT NULL AND val > 0;
Notes:
UNION
incurs overhead for removing duplicates. Use UNION ALL
to avoid that overhead. val IS NOT NULL
is redundant. But it explicitly expressions the conditions you want. Yes, you can do it by checking for IS NOT NULL
using a HAVING
filter.
SELECT 'FIRST', sum(value)
FROM SYSIBM.SYSDUMMY1 GROUP BY 'FIRST' HAVING sum(value) IS NOT NULL
UNION
SELECT 'SECOND', sum(value)
FROM SYSIBM.SYSDUMMY1 GROUP BY 'SECOND' HAVING sum(value) IS NOT NULL
UNION
SELECT 'THIRD', sum(value)
FROM SYSIBM.SYSDUMMY1 GROUP BY 'THIRD' HAVING sum(value) IS NOT NULL
If any of the sum(value)
s return NULL
, the associated SELECT
statement will return zero rows due to the GROUP BY
clause, resulting in the corresponding row omission.
If you want to omit a row based on either a NULL
or a zero sum, add an AND
conjunction like thus:
SELECT 'FIRST', sum(value) FROM SYSIBM.SYSDUMMY1 GROUP BY 'FIRST' HAVING sum(value) IS NOT NULL AND NOT sum(value) = 0
UNION
SELECT 'SECOND', sum(value) FROM SYSIBM.SYSDUMMY1 GROUP BY 'SECOND' HAVING sum(value) IS NOT NULL AND NOT sum(value) = 0
UNION
SELECT 'THIRD', sum(value) FROM SYSIBM.SYSDUMMY1 GROUP BY 'THIRD' HAVING sum(value) IS NOT NULL AND NOT sum(value) = 0
In addition, you can increase your query's likely efficiency by changing UNION
to UNION ALL
because you will not ever have duplicate rows in your final result. UNION
does a duplicate check which in this case will never trigger.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.