使用.extend方法向主表对象添加数据时如何避免生成空行?
解决主表对象循环添加空行的问题
你的问题出在Full Join的特性上:Full Join会返回参与连接的所有表的行,哪怕某一行在其他表中没有匹配项,这就导致当只有一个表有数据时,查询结果会出现包含空值的额外行,循环时这些空行被一并添加到了mastertbl里。
要避免空行,只需在查询中添加过滤条件,排除那些没有有效名称(或所有关键列都为空)的行。具体来说,在你的SELECT语句末尾加上WHERE coalesce(tab.name, tab1.name, tab2.name) IS NOT NULL——因为coalesce(tab.name, tab1.name, tab2.name)是你用来获取name的逻辑,只要这个值不为空,就说明该行至少来自某一个有数据的表。
修改后的完整代码如下:
For list_obj in (select coalesce(tab.name,tab1.name,tab2.name) name, tab1.location location, tab2.eduhist eduhist, tab.purchases purchases from tab full join tab1 on tab1.name = tab.name full join tab2 on tab2.name = tab1.name -- 过滤掉name为空的空行 WHERE coalesce(tab.name, tab1.name, tab2.name) IS NOT NULL) Loop var_comp.extend; n := n+1; var_listc(n) := mastertbl(list_obj.name, list_obj.location, list_obj.eduhist, list_obj.purchases); End loop;
如果需要更严格的过滤(比如确保至少有一个对象列不为空),也可以调整WHERE条件为:
WHERE tab.name IS NOT NULL OR tab1.name IS NOT NULL OR tab2.name IS NOT NULL
或者直接检查对象列的非空性:
WHERE tab1.location IS NOT NULL OR tab2.eduhist IS NOT NULL OR tab.purchases IS NOT NULL
这样修改后,循环只会处理有有效数据的行,mastertbl就不会出现多余的空行了。
内容的提问来源于stack exchange,提问作者BFF
相关产品推荐
相关产品推荐

