SQL实现新增列取A/B/C首个非空值并记录对应来源列名
SQL实现按优先级取首个非空值及对应来源列
实现逻辑
- D列:按照A→B→C的优先级,取第一个不为NULL的值
- Choice列:标记D列值对应的来源字段名
通用兼容写法(支持所有主流SQL数据库)
用标准SQL的COALESCE函数实现D列取值,用CASE表达式判断来源,写法简洁且无方言兼容问题:
SELECT id, A, B, C, COALESCE(A, B, C) AS D, CASE WHEN A IS NOT NULL THEN 'A' WHEN B IS NOT NULL THEN 'B' ELSE 'C' END AS Choice FROM 替换为你的实际表名;
说明:
COALESCE(值1,值2,值3...)是SQL标准函数,作用就是按参数传入顺序返回第一个非NULL值,完全匹配D列的取值规则。
结果验证
代入给出的样例数据执行后,返回结果和预期完全一致:
| id | A | B | C | D | Choice |
|---|---|---|---|---|---|
| 3 | NULL | NULL | 1 | 1 | C |
| 7 | 2 | NULL | 5 | 2 | A |
| 1 | NULL | 9 | 2 | 9 | B |
注意事项
如果业务场景中存在A、B、C三个字段全为NULL的情况,上述写法会返回D=NULL、Choice='C',如果需要适配全空场景,可以按需调整CASE表达式的ELSE分支逻辑。
内容的提问来源于stack exchange,提问作者Ben Hendel
相关产品推荐
相关产品推荐

