SQL查询需求:非空列优先返回,否则返回同表另一列值
解决方案:实现返回非空列值的子查询SQL
你需要的是一个能关联主表、返回单个值的子查询,核心逻辑是优先取指定列的非空值,为空则 fallback 到同表另一列。以下是几种通用且高效的实现方式:
1. 用 COALESCE 函数(推荐,标准SQL)
COALESCE 是SQL标准函数,会依次检查传入的列/值,返回第一个非空的结果,语法简洁且兼容绝大多数数据库(MySQL、PostgreSQL、SQL Server等)。
结合你的需求,子查询写法如下:
SELECT COALESCE(Name, LastName) FROM TableName t WHERE t.ID = Table2.ID
完整的查询语句(匹配你期望的结构):
SELECT Table2.ID, (SELECT COALESCE(Name, LastName) FROM TableName t WHERE t.ID = Table2.ID) AS Name FROM Table2;
2. 用 CASE 语句(通用兼容)
如果你的数据库对某些函数支持有限,或者需要更复杂的条件判断,可以用CASE语句实现,这是所有SQL数据库都支持的写法:
子查询写法:
SELECT CASE WHEN Name IS NOT NULL THEN Name ELSE LastName END FROM TableName t WHERE t.ID = Table2.ID
完整查询:
SELECT Table2.ID, (SELECT CASE WHEN Name IS NOT NULL THEN Name ELSE LastName END FROM TableName t WHERE t.ID = Table2.ID) AS Name FROM Table2;
3. MySQL 专属:IF 函数
如果你使用MySQL,也可以直接用IF函数简化判断,和你当前的处理方式逻辑一致,但更适合嵌入子查询:
子查询写法:
SELECT IF(Name IS NOT NULL, Name, LastName) FROM TableName t WHERE t.ID = Table2.ID
关键说明
- 子查询通过
ID关联主表Table2和TableName,确保每个主表行对应唯一的子查询结果(单个值),符合你的要求。 - 以上写法都会返回你期望的结果:ID=1时取
Maria,ID=2时取Torres。
内容的提问来源于stack exchange,提问作者Guilherme
相关产品推荐
相关产品推荐

