Oracle多列NVL应用:批量填充空值为'N'的最优方案
解决方法
直接修改UPDATE语句(适配已有临时表)
在UPDATE的子查询中,给每个字段套上NVL()函数,将未匹配到的NULL值直接替换为'N',单条语句就能完成所有列的空值填充:
update main_cust_table c set ( toyota, bmw, wv ) = ( select NVL(toyota, 'N'), NVL(bmw, 'N'), NVL(wv, 'N') from temp_table d where d.customer_id = c.customer_id ) WHERE EXISTS (SELECT 1 FROM temp_table d WHERE d.customer_id = c.customer_id); commit;
如果需要给所有客户(包括temp_table中没有的客户)统一设置默认'N',可以用MERGE语句避免遗漏:
MERGE INTO main_cust_table c USING (SELECT customer_id, toyota, bmw, wv FROM temp_table) d ON (c.customer_id = d.customer_id) WHEN MATCHED THEN UPDATE SET c.toyota = NVL(d.toyota, 'N'), c.bmw = NVL(d.bmw, 'N'), c.wv = NVL(d.wv, 'N') WHEN NOT MATCHED THEN UPDATE SET c.toyota = 'N', c.bmw = 'N', c.wv = 'N'; commit;
跳过临时表的优化方案
可以省去创建临时表的步骤,直接从purchase表聚合数据并处理空值,减少中间环节:
UPDATE main_cust_table c SET (toyota, bmw, wv) = ( SELECT NVL(MAX(DECODE(car_type, 'TOYOTA', 'Y')), 'N'), NVL(MAX(DECODE(car_type, 'BMW', 'Y')), 'N'), NVL(MAX(DECODE(car_type, 'WV', 'Y')), 'N') FROM purchase p WHERE p.customer_id = c.customer_id ); commit;
这里MAX(DECODE(...))会对客户的购车记录聚合,无对应车型时返回NULL,NVL()直接将NULL转为'N',一步完成所有更新操作。
内容的提问来源于stack exchange,提问作者Lizzie
相关产品推荐
相关产品推荐

