SQL 中存在 NULL 联接值时故意显示 NULL
Showing NULL on purpose when a NULL joined value is present in SQL
我有一个带有一些输入值的 table 和一个带有如下查找值的 table:
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
即我想显示原始值和映射值,但如果有 none,则显示原始值作为结果。
到目前为止,上述方法与 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
的替代方案可以达到我想要的效果?
我想你只是想要一个 case
表达式,例如
select input.[value]
, coalesce(mapping.[value], input.[value]) result
, case when mapping.lookupkey is not null then mapping.[value] else input.[value] end new_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
Returns:
value result new_result
a z z
c c NULL
我有一个带有一些输入值的 table 和一个带有如下查找值的 table:
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
即我想显示原始值和映射值,但如果有 none,则显示原始值作为结果。
到目前为止,上述方法与 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
的替代方案可以达到我想要的效果?
我想你只是想要一个 case
表达式,例如
select input.[value]
, coalesce(mapping.[value], input.[value]) result
, case when mapping.lookupkey is not null then mapping.[value] else input.[value] end new_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
Returns:
value result new_result
a z z
c c NULL