如何在SELECT查询中优先选取NULL值?附表数据与输出示例
如何实现按ID优先选取NULL值的SQL查询?
嘿,这个需求的核心逻辑很清晰:对每个ID分组后,如果存在NULL值的行就只保留这一行;如果没有NULL值,就保留该ID下的所有行。我给你两种实用的实现方案,适配不同的数据库环境:
方案一:用窗口函数(现代数据库通用)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server、Oracle等),这个方法逻辑直观,扩展性也强:
WITH ranked_rows AS ( SELECT Id, value, -- 给NULL值行标记最高优先级(0),非NULL行标记次优先级(1) ROW_NUMBER() OVER ( PARTITION BY Id ORDER BY CASE WHEN value IS NULL THEN 0 ELSE 1 END ) AS row_rank FROM your_table_name ) SELECT Id, value FROM ranked_rows -- 筛选规则:要么是当前ID的优先级最高行(即NULL行),要么该ID下没有任何NULL行 WHERE row_rank = 1 OR NOT EXISTS (SELECT 1 FROM ranked_rows r WHERE r.Id = ranked_rows.Id AND r.value IS NULL);
方案二:用EXISTS子句(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用这个更简洁的写法:
SELECT Id, value FROM your_table_name t -- 直接筛选两种符合条件的行: -- 1. 当前行本身就是NULL值 -- 2. 当前ID下不存在任何NULL值的行 WHERE value IS NULL OR NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.Id = t.Id AND t2.value IS NULL );
注意把代码里的your_table_name替换成你实际的表名就行,两种方案都能完美实现你要的输出效果。
内容的提问来源于stack exchange,提问作者George J




