[英]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.