简体   繁体   English

SQL DB2联合跳过NULL / 0行

[英]SQL DB2 Union skip NULL/0 rows

Is there an easy way to skip NULL rows in union? 有没有一种简单的方法可以跳过联合中的NULL行? I am on DB2. 我在使用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: 因此,如果其中一个并集具有0或NULL,则应将其跳过:

Estimated example result: 估计示例结果:

1---------|2-----
    FIRST   1
    THIRD   3

Use a subquery. 使用子查询。 I would also suggest union all : 我也建议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. UNION会导致删除重复项的开销。 Use UNION ALL to avoid that overhead. 使用UNION ALL避免该开销。
  • The comparison val IS NOT NULL is redundant. 比较val IS NOT NULL是多余的。 But it explicitly expressions the conditions you want. 但是它明确表达了您想要的条件。

Yes, you can do it by checking for IS NOT NULL using a HAVING filter. 是的,您可以使用HAVING过滤器检查IS NOT NULL来做到这一点。

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. 如果sum(value)的任何一个返回NULL ,则由于GROUP BY子句,关联的SELECT语句将返回零行,从而导致相应的行省略。

If you want to omit a row based on either a NULL or a zero sum, add an AND conjunction like thus: 如果你想省略基础上无论是行NULL 一个零和,添加AND一起像这样的:

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更改为UNION ALL来提高查询的效率,因为最终结果中永远不会有重复的行。 UNION does a duplicate check which in this case will never trigger. UNION进行重复检查,在这种情况下将永远不会触发。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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