如何编写DB2查询:优先取Ranking为First的name,无则取Second
DB2 查询:优先获取First等级记录,无则取Second等级
针对你的需求——优先查询Ranking = 'First'的name字段,当不存在这类记录时再查询Ranking = 'Second'的记录,完全忽略其他等级——这里有两种适合DB2的实现方案:
方案1:使用UNION ALL + EXISTS判断(逻辑直观,效率较高)
这种方法直接分情况处理,先获取所有First等级的记录,只有当First等级记录不存在时,才返回Second等级的记录:
SELECT name FROM your_table_name WHERE Ranking = 'First' UNION ALL SELECT name FROM your_table_name WHERE Ranking = 'Second' AND NOT EXISTS (SELECT 1 FROM your_table_name WHERE Ranking = 'First');
说明:
UNION ALL比UNION更高效,因为它不需要对结果集去重,适合保留所有符合条件的记录- 第二个查询的
NOT EXISTS条件确保只有当表中没有任何First等级记录时,才会执行并返回Second等级的记录
方案2:使用窗口函数(适合复杂优先级扩展)
如果后续可能需要扩展更多等级的优先级,窗口函数的方式更灵活:
SELECT name FROM ( SELECT name, -- 给First/Second分配优先级数值,First为最高优先级(1) MIN(CASE Ranking WHEN 'First' THEN 1 WHEN 'Second' THEN 2 ELSE 3 END) OVER () AS highest_priority FROM your_table_name -- 只筛选需要考虑的等级 WHERE Ranking IN ('First', 'Second') ) ranked_data -- 只保留和最高优先级匹配的记录 WHERE CASE Ranking WHEN 'First' THEN 1 WHEN 'Second' THEN 2 ELSE 3 END = highest_priority;
说明:
- 内层查询通过
MIN() OVER ()计算整个筛选结果集中的最高优先级(如果有First记录,最高优先级是1;否则是2) - 外层查询只返回优先级等于最高优先级的记录,实现"优先取First,无则取Second"的逻辑
记得把语句中的your_table_name替换成你实际使用的表名哦。
内容的提问来源于stack exchange,提问作者Mantas Lukosevicius
相关产品推荐
相关产品推荐

