Oracle MERGE语句匹配时仅更新目标表空值列的实现方法
Oracle MERGE 按需更新空值列解决方案
你可以通过Oracle内置的NVL函数实现仅更新目标表空值列的需求,逻辑是:目标表列值非空时保留原值,为空时才用来源表数据覆盖,对原MERGE语句的WHEN MATCHED部分的UPDATE字段逐个调整即可。
修改后的完整代码
MERGE INTO all_weather_mv p USING (SELECT a.ACTUAL_DRY_BULB_TEMP_F ,a.ACTUAL_DEW_POINT_F ,a.ACTUAL_WIND_SPEED_MPH ,a.ACTUAL_RELATIVE_HUMIDITY_PCT ,a.ACTUAL_STATION_PRESSURE_IN ,a.ACTUAL_HOURLY_PRECIP_IN ,a.OBJECTID ,a.DATETIME_UTC FROM gtt_all_weather_mv a ,wx_stations w WHERE w.OBJECTID = a.OBJECTID AND w.WX_PREFERENCE = 1) d ON (p.OBJECTID = d.OBJECTID AND p.DATETIME_UTC = d.DATETIME_UTC ) WHEN MATCHED THEN UPDATE SET p.ACTUAL_DRY_BULB_TEMP_F = NVL(p.ACTUAL_DRY_BULB_TEMP_F, d.ACTUAL_DRY_BULB_TEMP_F), p.ACTUAL_DEW_POINT_F = NVL(p.ACTUAL_DEW_POINT_F, d.ACTUAL_DEW_POINT_F), p.ACTUAL_WIND_SPEED_MPH = NVL(p.ACTUAL_WIND_SPEED_MPH, d.ACTUAL_WIND_SPEED_MPH), p.ACTUAL_RELATIVE_HUMIDITY_PCT = NVL(p.ACTUAL_RELATIVE_HUMIDITY_PCT, d.ACTUAL_RELATIVE_HUMIDITY_PCT), p.ACTUAL_STATION_PRESSURE_IN = NVL(p.ACTUAL_STATION_PRESSURE_IN, d.ACTUAL_STATION_PRESSURE_IN), p.ACTUAL_HOURLY_PRECIP_IN = NVL(p.ACTUAL_HOURLY_PRECIP_IN, d.ACTUAL_HOURLY_PRECIP_IN) WHEN NOT MATCHED THEN INSERT ( OBJECTID, DATETIME_UTC, ACTUAL_DRY_BULB_TEMP_F, ACTUAL_DEW_POINT_F, ACTUAL_WIND_SPEED_MPH, ACTUAL_RELATIVE_HUMIDITY_PCT, ACTUAL_STATION_PRESSURE_IN, ACTUAL_HOURLY_PRECIP_IN ) VALUES ( d.OBJECTID, d.DATETIME_UTC, d.ACTUAL_DRY_BULB_TEMP_F, d.ACTUAL_DEW_POINT_F, d.ACTUAL_WIND_SPEED_MPH, d.ACTUAL_RELATIVE_HUMIDITY_PCT, d.ACTUAL_STATION_PRESSURE_IN, d.ACTUAL_HOURLY_PRECIP_IN )
核心逻辑说明
NVL(参数1, 参数2)函数的作用是:如果第一个参数为NULL,就返回第二个参数的值,否则返回第一个参数本身- 对应到你的业务场景:每个更新字段都先判断目标表
p的当前列值是否为空,非空就保留原值,为空才用来源表d的对应值覆盖,自动适配单列/多列空值的场景,不需要额外写分支判断
可选优化
如果需要进一步减少不必要的行更新(比如目标行所有字段都已经有值的情况下,直接跳过更新操作),可以在WHEN MATCHED后面加WHERE条件过滤:
WHEN MATCHED WHERE (p.ACTUAL_DRY_BULB_TEMP_F IS NULL OR p.ACTUAL_DEW_POINT_F IS NULL OR p.ACTUAL_WIND_SPEED_MPH IS NULL OR p.ACTUAL_RELATIVE_HUMIDITY_PCT IS NULL OR p.ACTUAL_STATION_PRESSURE_IN IS NULL OR p.ACTUAL_HOURLY_PRECIP_IN IS NULL) THEN UPDATE -- 同上更新逻辑即可
这个优化可以降低日志生成量,提升大表执行效率。
内容的提问来源于stack exchange,提问作者Webb
相关产品推荐
相关产品推荐

