[英]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
避免该开销。 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.