【问题标题】:Showing NULL on purpose when a NULL joined value is present in SQL当 SQL 中存在 NULL 连接值时,故意显示 NULL
【发布时间】: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


【解决方案1】:

我认为你只想要一个 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

返回:

value   result  new_result
a       z       z
c       c       NULL

【讨论】:

  • 非常好!今天学到了新东西,谢谢! CASE 是通用的吗?即 ISO 标准,所以如果我需要转移到其他数据库提供商,这仍然有效吗?
  • @user1589188 不要将 standardportable 混淆。大多数数据库都可以处理select 30 / 3 / 5;select 30 / -3 / 5;。 SQL Server 以不同方式 处理它们。像DBFiddle 这样的网站可以让你尝试不同的数据库。
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2022-01-17
  • 2022-08-17
  • 2016-09-07
  • 1970-01-01
相关资源
最近更新 更多