如何基于COALESCE的取值来源同步获取对应字段值?
问题描述
我创建了一个视图合并两张表,查询要求Val字段仅存在于其中一张表,另一张表该字段为NULL,因此用了COALESCE(tbl1.Val, tbl2.Val) As Val来获取Val值。现在需要获取和Val取值来源相同的表中的Val2字段值(两张表的Val2可能不同或为NULL),设想的伪代码是(if tbl1.Val = NULL then tbl1.Val2 else tbl2.Val2) as Val2。想问能不能用IIF、ISNULL这类SQL函数实现?扩展到3张表的话会有多复杂?
输入示例
tbl1.Val = NULL, tbl2.Val = NULL, tbl3.Val = 'VALUE' tbl1.Val2 = 'NOT THIS ONE', tbl2.Val2 = 'NOT THIS ONE', tbl3.Val2 = 'THIS ONE'
预期输出
Val Val2 'VALUE' 'THIS ONE'
尝试过的写法(未成功)
IIF(tbl1.Val = NULL, tbl1.Val2, tbl2.Val2) IIF(ISNULL(tbl1.Val, False), tbl1.Val2, tbl2.Val2)
解决方案
针对2张表的情况
你之前的写法出错核心原因是SQL中不能用=判断NULL,必须用IS NULL或ISNULL()函数来做空值判断。
可以用以下几种方式实现:
- 用
IIF结合IS NOT NULL判断:
IIF(tbl1.Val IS NOT NULL, tbl1.Val2, tbl2.Val2) AS Val2
逻辑和COALESCE(tbl1.Val, tbl2.Val)完全匹配:如果tbl1的Val不为空,就取tbl1的Val2,否则取tbl2的Val2。
- 用
CASE语句(可读性更强):
CASE WHEN tbl1.Val IS NOT NULL THEN tbl1.Val2 ELSE tbl2.Val2 END AS Val2
- 用
ISNULL嵌套:
ISNULL(CASE WHEN tbl1.Val IS NOT NULL THEN tbl1.Val2 END, tbl2.Val2) AS Val2
扩展到3张表的情况
逻辑和2张表一致,完全跟着COALESCE的取值优先级走,推荐用CASE语句实现,可读性最高:
COALESCE(tbl1.Val, tbl2.Val, tbl3.Val) AS Val, CASE WHEN tbl1.Val IS NOT NULL THEN tbl1.Val2 WHEN tbl2.Val IS NOT NULL THEN tbl2.Val2 ELSE tbl3.Val2 END AS Val2
这种写法的逻辑和COALESCE完全对应,后续如果再加更多表,只需要继续在CASE里增加WHEN分支即可,复杂度是线性增长,不会出现逻辑混乱。
如果想用嵌套IIF也可以,但3张表以上可读性会下降:
IIF(tbl1.Val IS NOT NULL, tbl1.Val2, IIF(tbl2.Val IS NOT NULL, tbl2.Val2, tbl3.Val2)) AS Val2
内容的提问来源于stack exchange,提问作者AweSomeBody
相关产品推荐
相关产品推荐

