繁体   English   中英

SQL DB2联合跳过NULL / 0行

[英]SQL DB2 Union skip NULL/0 rows

有没有一种简单的方法可以跳过联合中的NULL行? 我在使用DB2。

例:

SELECT 'FIRST', sum(value) FROM  SYSIBM.SYSDUMMY1
UNION
SELECT 'SECOND', sum(value) FROM  SYSIBM.SYSDUMMY1
UNION
SELECT 'THIRD', sum(value) FROM  SYSIBM.SYSDUMMY1

结果:

1---------|2-----
    FIRST   1
    SECOND  NULL/0
    THIRD   3

因此,如果其中一个并集具有0或NULL,则应将其跳过:

估计示例结果:

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

使用子查询。 我也建议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;

笔记:

  • UNION会导致删除重复项的开销。 使用UNION ALL避免该开销。
  • 比较val IS NOT NULL是多余的。 但是它明确表达了您想要的条件。

是的,您可以使用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

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

如果你想省略基础上无论是行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

另外,您可以通过将UNION更改为UNION ALL来提高查询的效率,因为最终结果中永远不会有重复的行。 UNION进行重复检查,在这种情况下将永远不会触发。

暂无
暂无

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

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