【发布时间】:2020-09-14 00:59:51
【问题描述】:
我有一个包含一些输入值的表和一个包含如下查找值的表:
select input.value, coalesce(mapping.value, input.value) result from (
select 'a' union all select 'c'
) input (value) left join (
select 'a', 'z' union all select 'b', 'y'
) mapping (lookupkey, value) on input.value = mapping.lookupkey
给出:
value | result
--------------
a | z
c | c
即我想显示原始值以及映射值,但如果没有,则显示原始值作为结果。
到目前为止,上述方法与coalesce 一起工作得很好,以确定是否存在映射值。但是现在如果我允许 NULL 作为有效的映射值,我希望看到 NULL 作为结果而不是原始值,因为它确实找到了映射值,只是映射值是 NULL。上面的相同代码未能实现这一点:
select input.value, coalesce(mapping.value, input.value) result from (
select 'a' union all select 'c'
) input (value) left join (
select 'a', 'z' union all select 'b', 'y' union all select 'c', null
) mapping (lookupkey, value) on input.value = mapping.lookupkey
它提供与上面相同的输出,但我想要的是:
value | result
--------------
a | z
c | NULL
有没有替代coalesce可以实现我想要的?
【问题讨论】:
-
为什么不使用'undefined'值来标记映射中的值为空?
-
@AndreiXwe 我可以,但在某些时候我必须将'undefined' 替换回 null,如果原来的 IS 'undefined' 我不想替换它,所以不是银弹。
标签: sql sql-server tsql coalesce