Oracle SQL中如何实现按指定值优先级的WHERE IN筛选?
实现带优先级的WHERE筛选逻辑方案
当然可行,根据你的需求,分两种常见场景给出实现方式:
场景1:仅返回优先级最高且存在的分组数据
如果需要只返回val1的行(只要存在),val1不存在时才返回val2的行,val2也不存在时返回val3的行,可以通过以下两种方式实现:
写法一:UNION ALL + EXISTS 判断
-- 优先取val1的行 SELECT * FROM table t WHERE t.field = 'val1' UNION ALL -- 若val1不存在,取val2的行 SELECT * FROM table t WHERE t.field = 'val2' AND NOT EXISTS (SELECT 1 FROM table WHERE field = 'val1') UNION ALL -- 若val1和val2都不存在,取val3的行 SELECT * FROM table t WHERE t.field = 'val3' AND NOT EXISTS (SELECT 1 FROM table WHERE field IN ('val1', 'val2'))
写法二:CASE 结合聚合判断
SELECT * FROM table t WHERE t.field = CASE WHEN EXISTS (SELECT 1 FROM table WHERE field = 'val1') THEN 'val1' WHEN EXISTS (SELECT 1 FROM table WHERE field = 'val2') THEN 'val2' ELSE 'val3' END
场景2:返回所有符合条件的数据,按指定优先级排序
如果需要返回所有field为val1/val2/val3的行,但按val1>val2>val3的顺序排序,可以用CASE语句自定义排序规则:
SELECT * FROM table t WHERE t.field IN ('val1', 'val2', 'val3') ORDER BY CASE t.field WHEN 'val1' THEN 1 WHEN 'val2' THEN 2 WHEN 'val3' THEN 3 END ASC
这样查询结果会优先展示val1的行,接着是val2,最后是val3。
内容的提问来源于stack exchange,提问作者TylerD
相关产品推荐
相关产品推荐

