PostgreSQL:按指定值筛选或用自定义默认值的优化查询方法
更简洁的PostgreSQL实现方式
针对你的需求,这里提供几种更优雅简洁的PostgreSQL查询方案:
方案1:用CASE+EXISTS做直观判断
直接判断目标locale是否存在数据,逻辑清晰易懂:
SELECT * FROM locale_info WHERE locale = CASE WHEN EXISTS (SELECT 1 FROM locale_info WHERE locale = 'en_ZA') THEN 'en_ZA' ELSE 'en' END;
方案2:用UNION ALL实现优先级查询
利用PostgreSQL对UNION ALL的优化特性,优先返回目标locale的数据,不存在时再返回默认值,性能更优:
-- 优先取'en_ZA'数据,无数据则取'en' SELECT * FROM locale_info WHERE locale = 'en_ZA' UNION ALL SELECT * FROM locale_info WHERE locale = 'en' LIMIT ALL;
如果想更严谨地避免在目标locale有数据时扫描默认值的表,可以加上NOT EXISTS过滤:
SELECT * FROM locale_info WHERE locale = 'en_ZA' UNION ALL SELECT * FROM locale_info WHERE locale = 'en' AND NOT EXISTS (SELECT 1 FROM locale_info WHERE locale = 'en_ZA');
方案3:简化原有的COALESCE写法
原查询中的DISTINCT完全多余,只需判断是否存在任意一条匹配数据即可,简化后更高效:
SELECT * FROM locale_info WHERE locale = COALESCE( (SELECT locale FROM locale_info WHERE locale = 'en_ZA' LIMIT 1), 'en' );
内容的提问来源于stack exchange,提问作者Wainage
相关产品推荐
相关产品推荐

