简体   繁体   中英

SQL DB2 Union skip NULL/0 rows

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.
  • The comparison 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM