Oracle SQL查询实现:LOCATION表优先取area_nme非空记录
适配双场景的Oracle SQL查询方案
核心需求为同一location_id下优先返回area_nme非空的记录,仅当该id无任何area_nme非空记录时,返回area_nme为空的记录,推荐使用Oracle支持的窗口函数实现,逻辑清晰性能更优:
SELECT location_id, location_nme, pstl_cd, area_nme FROM ( SELECT t.*, -- 按location_id分组,非空area_nme排序优先级更高 ROW_NUMBER() OVER ( PARTITION BY location_id ORDER BY CASE WHEN area_nme IS NOT NULL THEN 1 ELSE 2 END ASC ) AS rn FROM LOCATION t WHERE location_id = :input_location_id -- 替换为实际要查询的location_id,如123、789 ) WHERE rn = 1;
逻辑验证
- 场景1查询
location_id=123:分组内area_nme为Southern的非空记录排序为第1位,直接返回该条符合要求的结果 - 场景2查询
location_id=789:该id不存在area_nme非空的记录,唯一的空值记录排序为第1位,正常返回不会出现无结果的问题
老版本Oracle兼容方案
如果使用不支持窗口函数的Oracle老版本,可改用EXISTS逻辑实现:
SELECT * FROM LOCATION t WHERE location_id = :input_location_id AND ( area_nme IS NOT NULL -- 仅当当前id没有非空area_nme记录时,才保留空值记录 OR NOT EXISTS ( SELECT 1 FROM LOCATION t2 WHERE t2.location_id = t.location_id AND t2.area_nme IS NOT NULL ) );
内容的提问来源于stack exchange,提问作者nodev_101
相关产品推荐
相关产品推荐

